C语言地址和指针的概念指针教育课件.ppt

上传人:知****量 文档编号:71811615 上传时间:2023-02-06 格式:PPT 页数:40 大小:358KB
返回 下载 相关 举报
C语言地址和指针的概念指针教育课件.ppt_第1页
第1页 / 共40页
C语言地址和指针的概念指针教育课件.ppt_第2页
第2页 / 共40页
点击查看更多>>
资源描述

《C语言地址和指针的概念指针教育课件.ppt》由会员分享,可在线阅读,更多相关《C语言地址和指针的概念指针教育课件.ppt(40页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、C C语言地址语言地址和指针的概和指针的概念指针念指针PPTPPT讲座讲座10.1 地址和指针的概念地址和指针的概念 例如:例如:int i,j,k;i=3;j=6;k=i+j;编译时编译时,系统将内存单元分配给变量后系统将内存单元分配给变量后,变量名就不变量名就不存在了存在了,程序执行时对变量的操作实际上就是根据变程序执行时对变量的操作实际上就是根据变量名查找与之对应的变量的地址量名查找与之对应的变量的地址,然后对地址中的数然后对地址中的数据进行操作。据进行操作。对变量的操作实际上是对变量所对应的地址中的对变量的操作实际上是对变量所对应的地址中的数据进行操作。数据进行操作。1.直接访问直接访

2、问 k =i +j 2004 2000 2002 2005=9 2001=3 2003=6 2.间接访问间接访问*kp =*ip +*jp 3014 3010 3012 3015 2004 3011 2000 3013 2002 2005=9 2001=3 2003=6 这里:这里:i p,j p,k p:就称为指针变量,其值是另一个就称为指针变量,其值是另一个变量所对应的内存地址。变量所对应的内存地址。ijkipjpkp200220002004301030123014369 200020022004 用户数据区用户数据区10.2 10.2 变量的指针和指向变量的指针变量变量的指针和指向变量的

3、指针变量 变量的指针:就是变量的地址。变量的指针:就是变量的地址。如如 i i 所对应的内存地址是所对应的内存地址是20002000,则,则 i i 的指针就是的指针就是2000 2000 指针变量:用来存放变量地址的变量,指针变量:用来存放变量地址的变量,如:如:ipip所对应的地址是所对应的地址是30103010,其内容是,其内容是2000,20002000,2000就是就是 i i 所对应的地址(指针),因此,所对应的地址(指针),因此,ipip是存放变量是存放变量 i i 的地址的变量。的地址的变量。若若ip ip 是存放变量是存放变量i i 的地址的指针变量,即的地址的指针变量,即i

4、p=&i;ip=&i;则则 *ip*ip是指针变量是指针变量 ipip所指的对象(即变量所指的对象(即变量 i)i)ip20003i2000 i=3 则则 等价等价 *ip=310.2.1 定义一个指针变量定义一个指针变量 指针变量在使用前必须定义,以便使其指向特定类型的变量指针变量在使用前必须定义,以便使其指向特定类型的变量 例:例:指针变量的定义形式指针变量的定义形式:类型标识符类型标识符 *标识符标识符 其中:类型标识符:指出指向何种数据类型的变量其中:类型标识符:指出指向何种数据类型的变量 标识符:表示指针变量名标识符:表示指针变量名.例例:float *p3;/*p3是指向实型变量的

5、指针变量是指向实型变量的指针变量 */char *p4;/*p4是指向字符型变量的指针变量是指向字符型变量的指针变量 */int i,j;int *p1,*p2;p1=&i;p2=&j;i=3;*p1=5;j=6;*p2=8;3 56 820002002ijp1p220002002说明说明:1 1、定义时指针变量名前以、定义时指针变量名前以 *开头。开头。2 2、指针变量一经定义就只可指向同类型的变、指针变量一经定义就只可指向同类型的变量。量。如:如:float*p3;float*p3;指针变量名是指针变量名是p3p3,它只能指向实型数据。,它只能指向实型数据。3 3、在引用中,指针变量前加、

6、在引用中,指针变量前加 *表示表示指针变量所指向的指针变量所指向的 对象(即变量)。对象(即变量)。10.2.2 10.2.2 指针变量的引用指针变量的引用 通常,只能将变量的地址赋给指针变量,但通常,只能将变量的地址赋给指针变量,但在在Turbo cTurbo c中,整型数据(十进制、十六进制、中,整型数据(十进制、十六进制、八进制)也可赋给指针变量,八进制)也可赋给指针变量,如:如:int*p1;p1=100;int*p1;p1=100;printf(“%d n”,*p1);printf(“%d n”,*p1);指针变量有两种运算符:指针变量有两种运算符:&:取地址运算符,:取地址运算符,

7、如:如:p1=&i;p1=&i;*:指针变量所指对象运算符,:指针变量所指对象运算符,如:如:*p1,*p1,表示表示p1p1指向的对象是变量指向的对象是变量i i例例T10-1.c T10-1.c 指针变量操作简例指针变量操作简例 main()main()int a,b,*p1,*p2;int a,b,*p1,*p2;a=100;b=10;p1=&a;p2=&b;a=100;b=10;p1=&a;p2=&b;printf(“a=%d,b=%d n”,a,b);printf(“a=%d,b=%d n”,a,b);printf(“*p1=%d,*p2=%d n”,*p1,*p2);printf(

8、“*p1=%d,*p2=%d n”,*p1,*p2);printf(“&a=%x,&b=%x n”,&a,&b);printf(“&a=%x,&b=%x n”,&a,&b);printf(“p1=%x,p2=%x n”,p1,p2);printf(“p1=%x,p2=%x n”,p1,p2);printf(“&p1=%x,&p2=%x n”,&p1,&p2);printf(“&p1=%x,&p2=%x n”,&p1,&p2);运算结果:运算结果:a=100,b=10 a=100,b=10*p1=100,*p2=10*p1=100,*p2=10&a=ffd4,&b=ffd6&a=ffd4,&b=

9、ffd6 p1=ffd4,p2=ffd6 p1=ffd4,p2=ffd6&p1=ffd8,&p2=ffda&p1=ffd8,&p2=ffda1001001010ffd4ffd4ffd6ffd6a ab bp1p1p2p2ffd4ffd4ffd6ffd6ffd8ffd8ffdaffda关于关于&和和 *运算符的进一步说明:运算符的进一步说明:*、&:&:优先级同为优先级同为2 2级,级,结合性:从右向左。结合性:从右向左。1.1.若已执行:若已执行:int a,b,*p1,*p2;int a,b,*p1,*p2;p1=&a;p2=&b;a=100;b=10;p1=&a;p2=&b;a=100;b

10、=10;则则&*p1&*p1&a(p1)&a(p1)&*p2&*p2&b(p2)&b(p2)p2=&*p1 p2=&*p1 p2=&a p2=&a&a&a&b&bp1p1p2p21010100100b ba a&a&a&a&ap2p2p1p11010100100b ba a2.*&a2.*&a:先进行:先进行&a&a得得a a的地址,再对的地址,再对a a的地址的地址进行进行*运算运算 即指向即指向a a地址所指向的变量,就是地址所指向的变量,就是a a,其值是,其值是100 100 3.3.运算符运算符 *,+:优先级为:优先级为2 2,结合性:结合性:从右到左从右到左 (*p1)+(*p1

11、)+a+a+*p1+*p1+*(p1+)*(p1+)意即:意即:将将p1p1所指向的对象所指向的对象 a a 的值取出,的值取出,然后使然后使 p1 p1 自增,自增,p1p1原指向原指向a a,现在可能指向下一个现在可能指向下一个变量了。变量了。例例T10-2.c 输入输入a,b,用指针方法按先大后小的顺序输出。,用指针方法按先大后小的顺序输出。main()int *p1,*p2,*p,a,b;scanf(“%d%d”,&a,&b);p1=&a;p2=&b;printf(“a=%d,b=%d n”,a,b);printf(“*p1=%d,*p2=%dn”,*p1,*p2);printf(“&

12、a=%x,&b=%x n”,&a,&b);printf(“p1=%x,p2=%x,p=%x n”,p1,p2,p);printf(“&p1=%x,&p2=%x,&p=%x n”,&p1,&p2,&p);if(ab)p=p1;p1=p2;p2=p;printf(“a=%d,b=%d n”,a,b);printf(“*p1=%d,*p2=%dn”,*p1,*p2);printf(“&a=%x,&b=%x n”,&a,&b);printf(“p1=%x,p2=%x,p=%x n”,p1,p2,p);printf(“max=%d,min=%d n”,*p1,*p2);只交换了指针的值只交换了指针的值,

13、没有没有交换变量的值交换变量的值换后换后换前换前ffd8 ffd65 5ffd0ffd2ffd4ffd8ffd6ffd6 ffd820 ffd69 9p1p2pab 输入输入:5 9:5 9 输出输出:a=5,b=9 a=5,b=9*p1=5,*p2=9*p1=5,*p2=9&a=ffd6,&b=ffd8&a=ffd6,&b=ffd8 p1=ffd6,p2=ffd8,p2=20 p1=ffd6,p2=ffd8,p2=20&p1=ffd0,&p2=ffd2,&p=ffd4&p1=ffd0,&p2=ffd2,&p=ffd4 a=5,b=9 a=5,b=9*p1=9,*p2=5*p1=9,*p2=5

14、&a=ffd6,&b=ffd8&a=ffd6,&b=ffd8 p1=ffd8,p2=ffd6,p=ffd6 p1=ffd8,p2=ffd6,p=ffd6&p1=ffd0,&p2=ffd2,&p=ffd4&p1=ffd0,&p2=ffd2,&p=ffd4 max=9,min=5 max=9,min=5只交换了指针的值只交换了指针的值,没有交没有交换变量的值换变量的值换后换后换前换前ffd8 ffd6ffd8 ffd65 55 5ffd0ffd0ffd2ffd2ffd4ffd4ffd8ffd8ffd6ffd6ffd6 ffd8ffd6 ffd820 ffd620 ffd69 99 9p1p1p2p

15、2p pa ab b10.2.3 10.2.3 指针变量作为函数参数指针变量作为函数参数 指针变量作为函数参数时,传递的是变量的地址。指针变量作为函数参数时,传递的是变量的地址。例例T10-3.c T10-3.c 指针变量作函数参数,将两个整数按大小顺序输指针变量作函数参数,将两个整数按大小顺序输出。出。swap(int*p1,int *p2)swap(int*p1,int *p2)int p;p=*p1;*p1=*p2;*p2=p;int p;p=*p1;*p1=*p2;*p2=p;printf(“&p=%x,&p1=%x,&p2=printf(“&p=%x,&p1=%x,&p2=%x n”

16、,&p,&p1,&p2);%x n”,&p,&p1,&p2);printf(“p1=%x,p2=%x n”,p1,p2);printf(“p1=%x,p2=%x n”,p1,p2);printf(“p=%d,*p1=%d,*p2=%d n”,printf(“p=%d,*p1=%d,*p2=%d n”,p,*p1,*p2);p,*p1,*p2);ffcaffcaffd2ffd2ffd0ffd0ffd4ffd4ffd6ffd6ffd8ffd8ffdaffdap pp1p1p2p2a ab bp11p11p12p125 5ffd4ffd4ffd6ffd65 5 9 99 9 5 5ffd4ffd4f

17、fd6ffd6main()int a,b,*p11,*p12;scanf(“%d%d”,&a,&b);p11=&a;p12=&b;printf(“&a=%x,&b=%x,&p11=%x,&p12=%x n”,&a,&b,&p11&p12);printf(“p11=%x,p12=%x n”,p11,p12);printf(“a=%d,b=%d n”,a,b);if(ab)swap(p11,p12);printf(“max=%d,min=%d n”,a,b);运行:输入:运行:输入:5,9 输出输出:&a=ffd4,&b=ffd6,&p11=ffd8,&p12=ffda p11=ffd4,p12=

18、ffd6 a=5,b=9&p=ffca,&p1=ffd0,&p2=ffd2 p1=ffd4,p2=ffd6 p=5,*p1=9,*p2=5 max=9,min=5问题:函数调用结束后,问题:函数调用结束后,分配给分配给p1,p2单元释放否?单元释放否?ffcaffd2ffd0ffd4ffd6ffd8ffdapp1p2abp11p125 ffd4ffd65 99 5ffd4ffd6例例T10-3-1.c 对对T9-3.c中的中的 函数稍作改动函数稍作改动 swap(int*p1,int*p2)int *p;*p=*p1;*p1=*p2;*p2=*p;printf(“p=%x,p1=%x,p2=%

19、x n”,p,p1,p2);main()int a,b;int *p11,*p12;scanf(“%d%d”,&a,&b);p11=&a;p12=&b;if(ab)swap(p11,p12);printf(“a=%d,b=%d n”,a,b);如何解决此问题?ffd2ffd4ffd2ffd45 99 9ffd2ffd4p1 pp2abp11p12运行运行:5,9 输出输出:p=ffd2,p11=ffd2,p2=ffd4 a=9,b=9例例T10-3-2.c 在数据交换过程中在数据交换过程中,形实参采用普通变量形实参采用普通变量 swap(int x,int y)int t;t=x;x=y;y=

20、t;printf(“&t=%x,&x=%x,&y=%x n”,&t,&x,&y);printf(“t=%d,x=%d,y=%d n”,t,x,y);main()int a,b;scanf(“%d%d”,&a,&b);if(ab)swap(a,b);printf(“&a=%x,&b=%x n”,&a,&b);printf(“a=%d,b=%d n”,a,b);在被调用函数中变量在被调用函数中变量的值被交换了的值被交换了,返回主返回主函数后函数后,变量的值为什变量的值为什么依旧么依旧?原因原因:单向的单向的值传递值传递,当函数调用返当函数调用返回后回后,分配的单元被释分配的单元被释放了放了.55

21、99 559ffceffc8ffd0ffd2ffd4txyab输入输入:5,9输出输出:&t=ffc8,&x=ffce,&y=ffd0 t=5,x=9,y=5&a=ffd2,&b=ffd4 a=5,b=9例例T10-3-3.c 形参、实参都是指针变量时,虽在被调函数中改形参、实参都是指针变量时,虽在被调函数中改变了指针的值,但当返回主函数时,分配单元被释放,主调函变了指针的值,但当返回主函数时,分配单元被释放,主调函数中的实参指针仍指向原来变量。数中的实参指针仍指向原来变量。swap(int*p1,int*p2)int *p;p=p1;p1=p2;p2=p;printf(“&p=%x,&p1=

22、%x,&p2=%x n”,&p,&p1,&p2);printf(“p=%x,p1=%x,p2=%x n”,p,p1,p2);printf(“*p=%d,*p1=%d,*p2=%d n”,*p,*p1,*p2);main()int a,b,*p11,*p12;scanf(“%d%d”,&a,&b);p11=&a;p12=&b;if(ab)swap(p11,p12);printf(“&a=%x,&b=%x,&p11=%x,&p12=%x n”,&a,&a,&p11,&p12);printf(“a=%d,b=%d,p11=%x,p12=%x n”,a,b,p11,p12);printf(“*p11=

23、%d,*p12=%d n”,*p11,*p12);ffd2ffd2 ffd4ffd4 ffd259ffd2ffd4ffc8ffceffd0ffd2ffd4ffd6ffd8pp1p2abp11p12结论:形参与实参之间的数据传递(指针或普通变量)结论:形参与实参之间的数据传递(指针或普通变量)是单向的值传递,实参中指针的值并没有改变,变量是单向的值传递,实参中指针的值并没有改变,变量a,b的值也没改变。的值也没改变。若在被调函数中通过指针变量改变所指对象的值,结果若在被调函数中通过指针变量改变所指对象的值,结果如何?如何?例例T10-4.c 输入输入 a,b,c三个整数,按从大到小顺序输出三个整

24、数,按从大到小顺序输出 swap(int *pt1,int *pt2)int p;p=*pt1;*pt1=*pt2;*pt2=p;exchange(int *q1,int *q2,int *q3)if(*q1 *q2)swap(q1,q2);if(*q1 *q3)swap(q1,q3);if(*q2 *q3)swap(q2,q3);printf(“&q1=%x,&q2=%x,&q3=%x,q1=%x,q2=%x,q3=%x n”,&q1,&q2,&q3,q1,q2,q3);printf(“*q1=%d,*q2=%d,*q3=%d n”,*q1,*q2,*q3);main()int a,b,c,

25、*p1,*p2,*p3;scanf(“%d%d%d”,&a,&b,&c);p1=&a;p2=&b;p3=&c;printf(“&a=%x,&b=%x,&c=%x,a=%d,b=%d,c=%dn”,&a,&b,&c,a,b,c);ffbcffc2ffc4ffcaffccffceffd0ffd2ffd4ffd6ffd8ffdappt1pt2q2q1q3abcp1p2p3ffd09 10 10ffd2ffd49 0ffd0 ffd2ffd4 ffd4ffd00 0 910 9 0ffd2ffd4printf(“&p1=%x,&p2=%x,&p3=%x,p1=%x,p2=%x,p3=%x n”,&p1

26、,&p2,&p3,p1,p2,p3);printf(“*p1=%d,*p2=%d,*p3=%d,n”,*p1,*p2,*p3);exchange(p1,p2,p3);printf(“a=%d,b=%d,c=%d n”,a,b,c);输入:输入:9 0 10输出:输出:&a=ffd0,&b=ffd2,&c=ffd4,a=9,b=0,c=10&p1=ffd6,&p2=ffd8,&p3=ffda,p1=ffd0,p2=ffd2,p3=ffd4*p1=9,*p2=0,*p3=10&q1=ffca,&q2=ffcc,&q3=ffce,q1=ffd0,q2=ffd2,q3=ffd4*q1=10,*q2=9

27、,*q3=0 a=10,b=9,c=0ffbcffc2ffc4ffcaffccffceffd0ffd2ffd4ffd6ffd8ffdappt1pt2q2q1q3abcp1p2p3ffd09 10 10ffd2ffd49 0ffd0 ffd2ffd4 ffd4ffd00 0 910 9 0ffd2ffd410.3 10.3 数组的指针和指向数组的指针变量数组的指针和指向数组的指针变量 数组的指针:指数组的起始地址。数组的指针:指数组的起始地址。数组元素的指针:指数组元素的地址。数组元素的指针:指数组元素的地址。数组的地址数组的地址指针变量,指针变量就指向该数组了。指针变量,指针变量就指向该数组了

28、。引用数组元素:引用数组元素:(1)(1)下标法:下标法:a3 a3(2)(2)指针法:用指针变量指向所找的数组元素。指针法:用指针变量指向所找的数组元素。10.3.1 10.3.1 指向数组元素的指针指向数组元素的指针 例:例:int a5;int a5;int *p;int *p;p=a;p=a;p=&a0;p=&a0;等价等价 例例T10-4-1.c main()int a5;int *p=&a0;*p=2;printf(“&p=%x,p=%x n”,&p,p);printf(“&a=%x,&a0=%x,a0=%d n”,&a,&a0,a0);printf(“*p=%dn”,*p);2f

29、fceffceffd0ffd2ffd4ffd6ffd8a0a1a2a3a4p输出:输出:&p=ffd8,p=ffce&a=ffce,&a0=ffce,a0=2 *p=210.3.2 通过指针引用数组元素通过指针引用数组元素 指针变量所指数组元素的地址的计算,与数组数据类型有关。指针变量所指数组元素的地址的计算,与数组数据类型有关。例例T10-4-2.c 指针变量指向不同类型数组时,指针变量值加指针变量指向不同类型数组时,指针变量值加1其其意义不同意义不同 main()int i,a3=1,3,5;float b3=2,4,6;int *p1=a;float *p2=b;printf(“&a0=

30、%x,&b0=%x,&p1=%x,&p2=%x n”,&a0,&b0,&p1,&p2);printf(“p1=%x,*p1=%d n”,p1,*p1);p1+;printf(“p1=%x,*p1=%d n”,p1,*p1);p1+;printf(“p1=%x,*p1=%d n”,p1,*p1);printf(“p2=%x,*p2=%4.2f n”,p2,*p2);p2+;printf(“p2=%x,*p2=%4.2f n”,p2,*p2);p2+;printf(“p2=%x,*p2=%4.2f n”,p2,*p2);p1=a;printf(“*(a+2)=%d n”,*(a+2);p2=b;p

31、rintf(“*(p2+1)=%4.2f n”,*(p2+1);135246ffc4ffcaffc4ffc6ffc8ffcaffceffd2ffd6ffd8p1p2a0a1a2b0b1b2p1p2 注:若注:若a=&a0=ffc4 则则a+0=ffc4 ,a+1=ffc6 即即:a+0&a0 a+1&a1 若若b=&b0=ffca 则则b+1=ffce ,a+2=ffd2输出:输出:&a0=ffc4,&b0=ffca,&p1=ffd6,&p2=ffd8 p1=ffc4,*p1=1 p1=ffc6,*p1=3 p1=ffc8,*p1=5 p2=ffca,*p2=2.00 p2=ffce,*p2=

32、4.00 p2=ffd2,*p2=6.00*(a+2)=5*(p2+1)=4.00135246ffc4ffcaffc4ffc6ffc8ffcaffceffd2ffd6ffd8a0a1a2b0b1b2p1p2几点说明几点说明:设设 a a:数组,:数组,p p:指针变量,当数据类型不同时其地址的计算:指针变量,当数据类型不同时其地址的计算方法也不同。方法也不同。(1)p=a(1)p=a p+i =a+i p+i =a+i&ai&ai 而而a a的第的第 i i 个元素的实际地址为个元素的实际地址为:a +i *d(a +i *d(数组元素所占字节数数组元素所占字节数)如如:数组数组a a第第2

33、2个元素的地址个元素的地址:a+2*2=ffc4+4=ffc8:a+2*2=ffc4+4=ffc8 数组数组b b第第2 2个元素的地址个元素的地址:b+2*4=ffca+8=ffd2:b+2*4=ffca+8=ffd2 int 2 char 1 float 4 double 8d=135246ffc4ffc4ffc6ffc8ffcaffceffd2ffd6a0a1a2b0b1b2p(2)*(p+i)=*(a+i)=ai 编译时,按数组首地址加上相对位移量得到要找数组元素编译时,按数组首地址加上相对位移量得到要找数组元素的地址,然后取出该单元中的内容,即:的地址,然后取出该单元中的内容,即:*

34、(a+i)例例:a的首地址:的首地址:ffc4,则对,则对a2的存取方法为的存取方法为:*(&a2)=*(a+2*2)=*(ffc4+4)=*(ffc8)=a2=5(3)指向数组的指针变量可带下标指向数组的指针变量可带下标 如如:pi,ai,*(a+i),*(p+i)都是指向都是指向a数组的第数组的第i个元素。个元素。其中其中:a:数组名数组名 p:指向指向a 的指针变量的指针变量 初值初值p=a135246ffc4ffc4ffc6ffc8ffcaffceffd2ffd6a0a1a2b0b1b2p举例:用三种方法输出数组元素举例:用三种方法输出数组元素 例例T10-5.c 用下标法用下标法 m

35、ain()int i,a5=55,66,77,88,99;for(i=0;i5;i+)printf(“&a%d=%x,a%d=%d n”,i,&ai,i,ai);输出:输出:&a0=ffd2,a0=55&a1=ffd4,a1=66&a2=ffd6,a2=77&a3=ffd8,a3=88&a4=ffda,a4=99 5566778899ffd2ffd4ffd6ffd8ffdaffd6a0a1a2a3a4a5 例例T10-5-1.c 计算数组元素地址法计算数组元素地址法 main()int i,a5=55,66,77,88,99;for(i=0;i5;i+)printf(“(a+%d)=%x,*(

36、a+%d)=%d n”,i,(a+i),i,*(a+i);输出:输出:(a+0)=ffd0,*(a+0)=55 (a+1)=ffd2,*(a+1)=66 (a+2)=ffd4,*(a+2)=77 (a+3)=ffd6,*(a+3)=88 (a+4)=ffd8,*(a+4)=99 5566778899ffd0ffd2ffd4ffd6ffd8ffdaa0a1a2a3a4a5 例例T10-5-2.c 用指针变量指向数组元素法(指针法)用指针变量指向数组元素法(指针法)main()int *p,a5=55,66,77,88,99;for(p=a;p(a+5);p+)printf(“p=%x,*p=%d

37、 n”,p,*p);输出:输出:p=ffd0,*p=55 p=ffd2,*p=66 p=ffd4,*p=77 p=ffd6,*p=88 p=ffd6,*p=99 5566778899ffd0ffd2ffd4ffd6ffd8ffdaa0a1a2a3a4pffd0例例T10-5-3.c指针下标法及指针变量指向数组元素指针下标法及指针变量指向数组元素 main()int i,*p,a5=55,66,77,88,99;p=a;for(i=0;i5;i+)printf(“p%d=%d,*(p+%d)=%d n”i,pi,i,*(p+i);输出:输出:p0=55,*(p+0)=55 p1=66,*(p+1

38、)=66 p2=77,*(p+2)=77 p3=88,*(p+3)=88 p4=99,*(p+4)=99使用指针变量时要注意的问题:使用指针变量时要注意的问题:(1)p+:合法,合法,因因p是指针变量,是指针变量,+只能用只能用于变量。于变量。a+:不合法不合法,因为因为a是数组名,其值是是数组名,其值是数组元素的首地址,是常量。数组元素的首地址,是常量。(2)指针变量使用时要注意当前值指针变量使用时要注意当前值.例例T10-6.c 利用指针变量连续两次输出数组元素利用指针变量连续两次输出数组元素 main()int i,*p,a5=55,66,77,88,99;p=a;for(i=0;i5;

39、i+,p+)printf(“p=%x,*p=%d n”,p,*p);for(i=0;i5;i+,p+)printf(“p=%x,*p=%d n”,p,*p);输出:输出:p=ffd2,*p=55 p=ffd4,*p=66 p=ffd6,*p=77 p=ffd8,*p=88 p=ffda,*p=99 p=ffdc,*p=-24 p=ffde,*p=285 p=ffe0,*p=1 p=ffe2,*p=-26 p=ffe4,*p=14445566778899-242851-261444a0a1a2a3a4a5a6a7a8a9p此结果,是何原因?此结果,是何原因?(3)数组下标越界时,编译不作检查,如

40、上例。数组下标越界时,编译不作检查,如上例。(4)指针变量使用时的几个问题;指针变量使用时的几个问题;+和和*优先级为优先级为2,结合性从右向左结合性从右向左 若若 p=a+3 则:则:*p+:将将p所指对象所指对象(a3)的值的值88取出,然后取出,然后p增增1 指向指向a4*+p:先将先将p增增1指向指向a4,然后将其指向的对象然后将其指向的对象a4的值的值99取出。取出。*p-:将将p所指对象所指对象(a3)的值的值88取出,然后取出,然后p减减1 指向指向a2*-p:先将先将p减减1指向指向a2,然后将其指向的对象然后将其指向的对象a2的值的值77取出。取出。5566778899ffd

41、0ffd2ffd4ffd6ffd8ffdaa0a1a2a3a4pffd6p若:若:p=a+i,则则*p+与与 ai+*p-与与 ai-*+p 与与 a+i*-p 与与 a-i 等价等价10.3.3 数组名作函数参数数组名作函数参数 main()int array10;f(array,10);f(int arr,int n)arr0 array0arr1 array1arr1 array1调用函数时,以数组名作实调用函数时,以数组名作实参时实际上是把数组的首地参时实际上是把数组的首地址传递给形参,此时,形参址传递给形参,此时,形参数组和实参数组占用的是同数组和实参数组占用的是同一段内存,在函数调

42、用过程一段内存,在函数调用过程中,改变形参数组元素实际中,改变形参数组元素实际上也是改变实参数组元素上也是改变实参数组元素,调用结束后,虽然形参数组调用结束后,虽然形参数组名不存在了,但对实参数组名不存在了,但对实参数组元素的操作起产生作用。元素的操作起产生作用。T10-7.c 将数组将数组a中中n个整数按相反顺序存放个整数按相反顺序存放 算法算法:an-1a0an-2a1an-int(n-1)/2)a(n-1)/2 a0a1a2a3a4a5a6a7a8a9x0 x1x2x3x4x5x6x7x8x93791106754224576011973mi=0;i=mj=n-1-im=(n-1)/2vo

43、id inv(int x,int n)int t,i,j,m=(n-1)/2;for(i=0;i=m;i+)j=n-1-i;t=xi;xi=xj;xj=t;return;main()int i,a10=3,7,9,11,0,6,7,5,4,2;printf(“the original array:n”);for(i=0;i10;i+)printf(“%d,”,ai);printf(“n”);inv(a,10);printf(“the array has been inverted:n”);for(i=0;i10;i+)printf(“%d,”,ai);printf(“n”);例例T10-7-1

44、.c 将上例中的形参将上例中的形参x改为指针变量改为指针变量,以接收实参数组以接收实参数组a传递来的地址传递来的地址,再设指针再设指针i,j,p 指向有关元素指向有关元素,以实现数组元素的以实现数组元素的转换。转换。void inv(int*x,int n)int *p,t,*i,*j,m=(n-1)/2;i=x;j=x+n-1;p=x+m;for(;i=p;i+,j-)t=*i;*i=*j;*j=t;return;t 3,*i 2,*j 3 t 7,*i 4,*j 7 t 9,*i 5,*j 9 t 11,*i 7,*j 11 t 0,*i 6,*j 0 3 27 49 511 70 66

45、07 115 94 72 3a0a1a2a3a4a5a6a7a8a9i,xp=x+mj main()int i,a10=3,7,9,11,0,6,7,5,4,2;printf(“the original array:n”);for(i=0;i10;i+)printf(“%d,”,ai);printf(“n”);inv(a,10);printf(“the array has been inverted:n”);for(i=0;i10;i+)printf(“%d,”,ai);printf(“n”);3 27 49 511 70 66 07 115 94 72 3a0a1a2a3a4a5a6a7a8

46、a9i,xP=x+mj t 3,*i 2,*j 3 t 7,*i 4,*j 7 t 9,*i 5,*j 9 t 11,*i 7,*j 11 t 0,*i 6,*j 0 例例T10-8.c 从从10个数中找出最大值和最小值个数中找出最大值和最小值,并分别存入全局并分别存入全局 量量max,min中中,在查找过程中在查找过程中 指针指针p:依次指向数组各元素:依次指向数组各元素,array_end:指向最未元素后指向最未元素后,array:指向指向array0所对应值。所对应值。int max,min;void max_min_value(int array,int n)int *p,*array

47、_end;array_end=array+n;max=min=*array;for(p=array+1;p max)max=*p;else if(*pmin)min=*p;return;100-24680-3456789number0 array0number1 array1number2 array2number3 array3number4 array4number5 array5number6 array6number7 array7number8 array8number9 array9parray_end-2 -2 4 -3 6 8456789100maxmin main()int

48、i,number10;printf(“enter 10 data n”);for(i=0;i10;i+)scanf(“%d”,&numberi);max_min_value(number,10);printf(“nmax=%d,min=%d n”,max,min);运行运行:enter 10 data-2 4 6 8 0 -3 45 67 89 10 输出输出:max=100,min=-3-2 -2 4 -3 6 8456789100maxmin100-24680-3456789number0 array0number1 array1number2 array2number3 array3number4 array4number5 array5number6 array6number7 array7number8 array8number9 array9parray_end

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 管理文献 > 产品策划

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁