资源描述:
《Chapter07 pointers》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、第七章指针主讲:白小军为什么要引入指针:可以使程序简洁、紧凑、高效可以有效地表示复杂的数据结构可以动态分配内存可以得到多于一个的函数返回值内容提要:●地址和指针的概念●指针变量的使用●指针与数组●字符串指针●函数与指针7.1地址和指针的概念程序中:inti;floatk;内存中每个字节有一个编号-----地址…...…...2000200120022005内存02003ik编译或函数调用时为其分配内存单元变量是对程序中数据存储空间的抽象地址:系统为变量分配的内存单元的编号,无符号整数指针:即一个变量的地址…...…...20002004200
2、62005整型变量i10变量i_pointer2001200220032000指针指针变量变量的内容变量的地址指针变量变量变量地址(指针)变量值指向地址存入指针变量指针变量:存放另一个变量的地址的变量,也就是存放一个指针的变量。例:inta;int*p;p=&a;p为指针变量,它存放整型变量a的首地址,我们称,指针变量p指向整型变量a。变量的访问方式:直接访问:通过变量名直接访问间接访问:定义一个变量p,存放a的地址,通过p访问a例:a=10;printf(“a=%d”,a);p=&a;printf(“a=%d”,*p);定义指针变量:格式:
3、变量类型*指针变量名7.2指针变量的使用例:inta;floatb;charc;int*pa=&a;float*pb=&b;char*pc=&c;说明:指针变量的类型,就是其所指向的内存中存放的数据的类型注意:指针变量中只能存放地址,不能将一个非地址类型的数据(如常数等)赋给一个指针变量思考:既然pa,pb,pc都是指针类型,那么能否互相赋值?指针变量的引用:两个有关的运算符:&:取地址运算符,取出变量的地址*:指针运算符,访问指针变量所指向的变量值例:inta,b,*p;p=&a;/*直接访问方式*/a=10;b=a;printf("a
4、=%dtb=%d",a,b);/*间接访问方式*/*p=100;/*存入数据*/b=*p;/*取出数据*/printf("a=%dtb=%d",*p,b);注意:在定义指针变量时,还未规定它指向哪一个变量,此时不能用*运算符访问指针。只有在程序中用赋值语句具体规定后,才能用*运算符访问所指向的变量。例:inta,*p;*p=10;inta,*p;p=&a;*p=10;区分:指针运算符*和指针变量说明中的指针说明符*不是一回事。在指针变量说明中,“*”是类型说明符,表示其后的变量是指针类型。而表达式中出现的“*”则是一个运算符用以表示指
5、针变量所指的变量值。例:输入三个整数,求最大值,用指针实现inta,b,c;int*p;printf("Inputa,b,cplease:");scanf("%d%d%d",&a,&b,&c);p=&a;if(b>*p)p=&b;if(c>*p)p=&c;printf("max=%d",*p);数组的存储:顺序存储,数组名代表首地址7.3数组与指针例:ints[10]={1,2,3,4,5};int*p,*q,i;p=&s[0];q=s;printf(“%dt%d”,*p,*q);p++;q+=2;printf(“%dt%d”,*p,
6、*q);s[0]s[1]s[2]s[3]s[4]s[5]s[6]s[7]s[8]s[9]s..............................main(){ints[10]={1,2,3,4,5};inti,*p;for(i=0;i<5;i++){printf("t%d",*(s+i));}p=s;for(i=0;i<5;i++){printf("t%d",p[i]);}}使用指针操作数组:a[0]a[1]a[2]a[3]a[9]...aa+9a+1a+2地址元素下标法a[0]a[1]a[2]a[9]a[0]a[1]a[2]a[3
7、]a[9]...pp+9p+1p+2地址元素指针法*p*(p+1)*(p+2)*(p+9)[]变址运算符a[i]*(a+i)a[i]p[i]*(p+i)*(a+i)*a*(a+1)*(a+2)*(a+9)p[0]p[1]p[2]p[9]数组元素的表示指针变量的运算:赋值运算inta,b,*p,*q;ints[10];p=&a;q=&b;p=q;p=s;//错误的格式p=2000;a=p;ints[10];int*p;p=s;p++;p+=5;p=s+5;算术运算ints[10];int*p,*q;p=&s[0];q=&s[2];pri
8、ntf("q-p=%d",q–p);if(p