1、总结:变量的地址是指该变量所占存储单元的第一个字节的地址。也就是整个房子的地址是第一个房间的房间号。所以变量a的地址为001。2、指针变量 int *p; float c;指针变量的房子也是4个字节大小,房子里住的不是实际的数据,而是地址。不是所有的地址都可以住进去,只有同类型的简单变量的地址,才可以放到同类型的指针变量里。指针变量p中可以存放变量a的地址值,但是不可以存放变量c的地址值,因为只有同类型的简单变量的地址,才可以放到同类型的指针变量里。如何定义指针变量?一般形式:类型名 *指针变量名int *pi,*pj;double *pd;指针变量定义中的*号必不可少。int *pi,*pj
2、;中的int是指针变量pi和pj的基类型,它决定了只有int类型的简单变量的地址值才能放到指针变量pi和pj中。3、二级指针、一级指针和简单变量的关系int *p,*s,k=20; s=&k; p=&s;用两个*号定义的变量叫二级指针变量,用一个*号定义的变量叫一级指针变量。二级指针变量里存放同类型的一级指针变量的地址,一级指针变量里存放同类型的简单变量的地址。&是求地址运算符,它是单目运算符,操作数出现在&的右边。如:s=&功能是求出简单变量k的地址,并且把k的地址放到指针变量s的房子里。4、指针移动和基类型的关系int *p,a,b;p=&a;ab P请问p+1后,指针p是指向了变量a的第
3、二个字节,还是指向了变量b的第一个字节?答案是指向了变量b的第一个字节。p+1不是指针移动一个字节,而是移动一个存储单元,一个存储单元多大,取决于指针变量在定义时所用的关键字,如本题中的int *p,因为指针变量p是用int 定义的,所以一个存储单元的长度就是4个字节大小,故p+1才会指向变量b的第一个字节。如果这样定义:double *p;那么p+1后,指针变量p移动几个字节?5、给指针变量赋值(3个方法) 通过求地址运算符(&)赋值int k=1,*p;通过指针变量赋值int k=1,*p,*q; q=p;程序段的功能是:把k的地址赋给指针变量p,然后再通过指针变量p把k的地址赋给指针变量
4、q,最终结果是让p和q都指向了变量k。通过标准函数赋值(详见13章)6、&和*的区别 &:求地址运算符,后跟一个变量,功能是求出改变量的地址值。&a,但是&后不能跟表达式和常量,如:2、&(k+1)都是不合法的,也就是说,&后只能跟一个变量。*:间址运算符,后跟一个指针变量,目的是引用该指针所指向的房子。int *p,i=10,j;i;j=*p;j=*(&i);分析:1 j=*p;等价于j=i;2 j=*(& 等价于j=i;因为&和*是互逆操作,同时出现相互抵消。3 切记:后只能跟简单变量名,而*后只能跟指针变量名。例8.1用指针指向两个变量,通过指针运算选出值小的那个数。#includemain()int a,b,min,*pa,*pb,*pmin; pa=&pb=&b;pmin=&min;scanf(“%d%d”,pa,pb);printf(“a=%d b=%dn”,a,b);*pmin=*pa;if(*pa*pb) *pmin=*pb;printf(“min=%dn”,min);解析:pa=&功能是把变量a的地址放到指针变量pa中,也就是让指针pa指向了变量a。*pmin=*pa;等价于min=a; *pa*pb等价于ab, *pmin=*pb;等价于min=b。