C语言地址和指针的概念指针教育课件.ppt
《C语言地址和指针的概念指针教育课件.ppt》由会员分享,可在线阅读,更多相关《C语言地址和指针的概念指针教育课件.ppt(40页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
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,
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 地址 指针 概念 教育 课件
限制150内