马桶屋
萌导航

8.2C语言指针变量

作者: 叶子 来源: 怪哈哈网 日期: 2015-09-28 17:24:55 人气: -

变量的指针就是变量的地址。存放变量地址的变量是指针变量。即在C语言中,允许用一个变量来存放指针,这种变量称为指针变量。因此,一个指针变量的值就是某个变量的地址或称为某变量的指针。

为了表示指针变量和它所指向的变量之间的关系,在程序中用*符号表示“指向”,例如,i_pointer代表指针变量,而*i_pointer是i_pointer所指向的变量。因此,下面两个语句作用相同:

i=3;
*i_pointer=3;

第2个语句的含义是将3赋给指针变量i_pointer所指向的变量。

定义指针变量

定义指针变量的一般形式为:

类型说明符 *变量名;

其中,*表示这是一个指针变量,变量名是一个合法的标识符,类型说明符表示该指针变量所指向的变量的数据类型。例如:

int *p1;

表示p1是一个指针变量,它的值是某个整型变量的地址。或者说p1指向一个整型变量。至于p1究竟指向哪一个整型变量,应由向p1赋予的地址来决定。再如:

  1. int *p2;  //p2是指向整型变量的指针变量
  2. float *p3;  //p3是指向浮点变量的指针变量
  3. char *p4;  //p4是指向字符变量的指针变量

应该注意的是,一个指针变量只能指向同类型的变量,如 p3 只能指向浮点变量,不能时而指向一个浮点变量,时而又指向一个字符变量。

指针变量的引用

指针变量同普通变量一样,使用之前不仅要定义说明,而且必须赋予具体的值(初始化)。未初始化的指针变量的值是垃圾值,没有意义,不能使用,例如:

  1. #include <stdio.h>
  2. int main(){
  3. int *p;
  4. printf("%X\n", p);  //十六进制输出
  5. return 0;
  6. }

运行结果:
7EFDE000

以上输出是在64位操作系统上的结果,如果你的操作系统是32位,那么输出只有4位,如23EB、983A等,为什么呢?

指针变量的赋值只能赋予地址,决不能赋予任何其它数据,否则将引起错误。在C语言中,变量的地址是由编译器分配的,对用户完全透明,用户不能控制变量的具体地址。

两个有关的运算符:

  • &:取地址运算符;
  • *:指针运算符(或称“间接访问” 运算符)。


C语言中提供了地址运算符&来获取变量的地址。其一般形式为:

&变量名;

&a表示变量a的地址,&b表示变量b的地址。变量本身必须预先定义。

设有指向整型变量的指针变量p,如要把整型变量 a 的地址赋予p可以有以下两种方式。

1) 指针变量初始化的方法:

int a=10;
int *p=&a;

2) 赋值语句的方法:

int a=10;
int *p;
p=&a;


不允许把一个数字直接赋予指针变量,故下面的赋值是错误的:

int *p;
p=1000;

被赋值的指针变量前不能再加*说明符,如写为*p=&a也是错误的。假设:

int i=200, x;
int *ip;

我们定义了两个整型变量i、x,还定义了一个指向整型数的指针变量ip。i、x中可存放整数,而ip中只能存放整型变量的地址。我们可以把 i 的地址赋给 ip:

ip=&i;

此时指针变量 ip 指向整型变量 i,假设变量 i 的地址为1800,这个赋值可形象理解为下图所示的联系:


以后我们便可以通过指针变量 ip 间接访问变量 i,例如:

x = *ip;

运算符*访问以 ip 为地址的存储区域,而 ip 中存放的是变量 i 的地址,因此,*ip 访问的是地址为 1800 的存储区域(因为是整数,实际上是从1800开始的两个字节),它就是 i 所占用的存储区域,所以上面的赋值表达式等价于:

x = i;

另外,指针变量和一般变量一样,存放在它们之中的值是可以改变的,也就是说可以改变它们的指向。例如:

  1. int i, j, *p1, *p2;
  2. i = 'a';
  3. j = 'b';
  4. p1 = &i;
  5. p2 = &j;

可建立如下图所示的联系:


这时赋值表达式:

p2=p1;

就使p2与p1指向同一对象i,此时*p2就等价于i,而不是j,图所示:


如果执行如下表达式:

*p2=*p1;

则表示把p1指向的内容赋给p2所指的区域,此时就变成下图所示:


通过指针访问它所指向的变量是以间接访问的形式进行的,所以比直接访问一个变量要费时间,而且不直观,因为通过指针要访问哪一个变量,取决于指针的值(即指向),例如*p2=*p1;实际上就是j=i;,前者不仅速度慢而且目的不明。但由于指针是变量,我们可以通过改变它们的指向,以间接访问不同的变量,这给程序员带来灵活性,也使程序代码编写得更为简洁和有效。

指针变量可出现在表达式中,设:

int x, y, *px = &x;

指针变量px指向整数x,则*px可出现在x能出现的任何地方。例如:

  1. y=*px+5;  //表示把x的内容加5并赋给y
  2. y=++*px;  //px的内容加上1之后赋给y,++*px相当于++(*px)
  3. y=*px++;  //相当于y=*px; px++


指针使用举例:

  1. #include <stdio.h>
  2. int main(){
  3. int a=100, b=10;
  4. int *pointer_1, *pointer_2;
  5. pointer_1 = &a;
  6. pointer_2 = &b;
  7. printf("%d, %d\n", a, b);
  8. printf("%d, %d\n", *pointer_1, *pointer_2);

  9. return 0;
  10. }

运行结果:
100, 10
100, 10

对程序的说明:

  1. 在开头处虽然定义了两个指针变量pointer_1和pointer_2,但它们并未指向任何一个整型变量。只是提供两个指针变量,规定它们可以指向整型变量。程序第5、6行的作用就是使pointer_1指向a,pointer_2指向b。
  2. 第8行的*pointer_1和*pointer_2就是变量a和b。最后两个printf函数作用是相同的。
  3. 程序中有两处出现*pointer_1和*pointer_2,请区分它们的不同含义。
  4. 程序第5、6行的pointer_1=&apointer_2=&b不能写成*pointer_1=&a*pointer_2=&b


请对下面关于“&”和“*”的问题进行考虑:

  1. 如果已经执行了“pointer_1=&a;”语句,则&*pointer_1是什么含义?
  2. *&a含义是什么?
  3. (pointer_1)++和pointer_1++的区别?


【示例】输入a和b两个整数,按先大后小的顺序输出。

  1. #include <stdio.h>
  2. int main(){
  3. int *max, *min,*tmp, a, b;
  4. scanf("%d, %d",&a, &b);
  5. max = &a;
  6. min = &b;
  7. if(*max < *min){
  8. // 交换指针变量的值,tmp 为临时变量
  9. tmp = max;
  10. max = min;
  11. min = tmp;
  12. }
  13. printf("a=%d, b=%d\n", a, b);
  14. printf("max=%d, min=%d\n", *max, *min);

  15. return 0;
  16. }

运行结果:
10, 20↙
a=10, b=20
max=20, min=10


转载请注明文章来源(欢迎分享): http://www.guaihaha.com/c/5616.html

相关内容

第一弹APP
关于怪哈哈
怪哈哈是一个集搞笑,美女,动漫,游戏,技术等为核心的综合性网站!
联系我们
商务洽谈、广告合作、友情链接、侵权举报,这些都可以联系我们哦!
关于我们 - 联系我们 - 广告服务 - 免责申明  
本站文字和图片均为严格审查筛选收藏,均收集整理于互联网,其著作权归原作者所有,如果有侵犯您权利的照片,请来信告知,我们将及时撤销相应文字和图片。
Copyright @2014-2020 怪哈哈网 All Rights Reserved。
【谢谢大家一直支持贵站!】