全的C语言指针详解课件.pptx
《全的C语言指针详解课件.pptx》由会员分享,可在线阅读,更多相关《全的C语言指针详解课件.pptx(47页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第第6章章 指针指针n6.1 6.1 指针定义与使用指针定义与使用n6.2 6.2 指针与函数指针与函数n6.3 6.3 指针与数组指针与数组n6.4 6.4 指针与字符串指针与字符串n6.5 6.5 指针数组与多级指针指针数组与多级指针n6.6 6.6 指针与动态内存分配指针与动态内存分配n6.7 6.7 指针的深层应用指针的深层应用 6.1 指针的引出指针的引出一一.地址与指针地址与指针 1.地址与取地址运算地址与取地址运算 C程序中的变量在内存中占有一个可标识的存储区程序中的变量在内存中占有一个可标识的存储区,每一个存储区是由若干个字节组成每一个存储区是由若干个字节组成,每一个字节都有每
2、一个字节都有 自己的地址自己的地址,而一个存储区的而一个存储区的 地址是指该存储区中地址是指该存储区中 第一个字节的地址第一个字节的地址C语言允许在程序中使用变量的地址语言允许在程序中使用变量的地址(通过地址运算符通过地址运算符&可得到可得到)如如:float x;变量变量 x 的地址的地址-&x int a10;数组变量数组变量 a 的地址的地址-数组名数组名 a 2.指针与指针变量指针与指针变量(1)变量的访问方式变量的访问方式 直接访问直接访问:通过变量名或地址访问变量的存储区通过变量名或地址访问变量的存储区 例例:scanf(“%d”,&x);x=sqrt(x);printf(“%d”
3、,x);间接访问间接访问:将一个变量的地址存放在另一个变量中将一个变量的地址存放在另一个变量中.如将变量如将变量 x 的地址存放在的地址存放在 变量变量p 中中,访问访问x 时先找到时先找到p,再由再由p 中存放的地址找到中存放的地址找到 xpx 2012 10101010(2)指针指针:一个变量的指针就是该变量的地址一个变量的指针就是该变量的地址(指针就是地址指针就是地址)(3)指针变量指针变量:存放变量地址的变量存放变量地址的变量,它用来指向另一个变量它用来指向另一个变量 二、二、指针变量的定义指针变量的定义1.格式格式:数据类型数据类型 *指针变量名指针变量名;例例 int *p1;ch
4、ar *p2;2.说明说明:(1)在变量定义时在变量定义时,*号表示该变量是指针变量号表示该变量是指针变量 (注意注意:指针变量是指针变量是p1,p2,不是不是*p1,*p2)(2)定义指针变量后定义指针变量后,系统为其分配存储空间系统为其分配存储空间,用以存放用以存放 其他变量的地址其他变量的地址,但在对指针变量赋值前但在对指针变量赋值前,它并没有它并没有 确定的值确定的值,也不指向一个确定的变量也不指向一个确定的变量例例:int x,*p;x=5;px 2012 101051234注注:指针变量指针变量p的值是随机值的值是随机值,此时此时p 和和 x 并无关联并无关联(3)使指针变量指向一
5、个确定的变量必须进行赋值使指针变量指向一个确定的变量必须进行赋值 int x,*p;x=5;p=&x;px 2012 101051010三、三、指针变量的引用指针变量的引用 1.指针运算符指针运算符*(1)p与与*p不同不同,p是指针变量是指针变量,p的值是的值是p所指向的变量的地址所指向的变量的地址 *p 是是p 所指向的变量所指向的变量,*p的值是的值是p所指向的变量的值所指向的变量的值*p 的值为的值为 5(*p 表示表示 x),而而p 的值为的值为 1010(2)引用指针变量时的引用指针变量时的*与与 定义指针变量时的定义指针变量时的*不同不同 定义变量时的定义变量时的*只是表示其后的
6、变量是指针变量只是表示其后的变量是指针变量 int a,*p;p=&a;scanf(“%d”,p);printf(“%dn”,*p);*p=12;printf(“%dn”,*p);pa 2012 10105101012让让p指向指向a 对对a 重新赋值重新赋值等价于等价于 a=12 即即&a2.&与与*p=&a;*&a *(&a)*p a&*p&(*p)&a2abcd5 3.*与与+,-int a=2,b=5,c,d,*p;p 的值为的值为a 的地址的地址,*p 的值为的值为2p 的值不变的值不变,*p 的值为的值为 3(2)c=*p+;c=*(p+);c=*p;p+;执行后执行后 c 的值为
7、的值为 3 ,*p 的值为的值为 5(3)d=*+p;d=*(+p);+p;d=*p;执行后执行后 d 的值为的值为 3,*p 的值为的值为 3p 2012 10101010(1)p=&a;(*p)+;(等价于等价于 a+;)10123310143例例6.2#include void main()int *p1,*p2,*p,a,b;scanf(“%d%d”,&a,&b);p1=&a;p2=&b;if(ab)p=p1;p1=p2;p2=p;printf(“a=%d,b=%d n”,a,b);printf(“max=%d,min=%d n”,*p1,*p2);abp1p2p&a&b&a&b&a5
8、9输出结果输出结果:a=5,b=9max=9,min=5一、一、指针变量作函数参数指针变量作函数参数例例:2个数按大小顺序输出个数按大小顺序输出#include void swap(int x,int y)int temp;temp=x;x=y;y=temp;void main()int a,b;scanf(“%d%d”,&a,&b);if (ab)swap(a,b);printf(“a=%d,b=%dn”,a,b);abxytemp5说明说明:该程序不能实现该程序不能实现a 和和b 的交换因为实参的交换因为实参a,b 对形参对形参x,y 是是“值传递值传递”,x 和和y 的的变变化不影响化不
9、影响a 和和b 所以输出为所以输出为:a=5,b=99mainswap559956.2 指针与函数指针与函数例例 6.3#include void swap1(int *p1,int *p2)int temp;temp=*p1;*p1=*p2;*p2=temp;void main()int a,b,*pt1,*pt2;scanf(“%d%d”,&a,&b);pt1=&a;pt2=&b;if(ab)swap1(pt1,pt2);printf(“a=%d,b=%dn”,a,b);abp1p2temp&b&apt1pt25说明说明:这种方法是交换这种方法是交换p1和和p2所指向的变量的值所指向的变量
10、的值,即即交换交换main函数中函数中a 和和b的值的值所以输出为所以输出为:a=9,b=5mainswap159&a&b95例例 6.3#include void swap2(int *p1,int *p2)int *temp;*temp=*p1;*p1=*p2;*p2=*temp;说明说明:这种方法可能会破坏系统的正常这种方法可能会破坏系统的正常工作状态,因为工作状态,因为temp是一个指针变量是一个指针变量但是但是在函数中并没有给在函数中并没有给temp一个确定一个确定的地址,这样它所指向的内存单元是的地址,这样它所指向的内存单元是不可预见的不可预见的,而对,而对*temp的赋值可能的赋
11、值可能带来危害带来危害abpt1pt2main&a&bp1p2temp&b&aswap2?随机值随机值55959例例 6.3#include void swap3(int *p1,int *p2)int *p;p=p1;p1=p2;p2=p;p1p2p&a&a&b这种方法是交换形参这种方法是交换形参p1和和p2的值的值,使它们的指向发生改变使它们的指向发生改变,但是但是main函数中的函数中的a和和b的值并没有进行交换的值并没有进行交换所以输出为所以输出为:a=5,b=95a9b&apt1&bpt2main&b&aswap3 前面我们用到的函数前面我们用到的函数,有些无返回值有些无返回值,有些
12、有返回值有些有返回值,返回值返回值 类型多为类型多为 int,float,char.一个函数的返回值也一个函数的返回值也可以是一个指针可以是一个指针 类型的数据类型的数据(即地址即地址)定义函数定义函数:数据类型数据类型 *函数名函数名(形参表列形参表列)函数体函数体;例例:int *fun(int a,int b)函数体函数体;说明说明:定义一个返回指针值的函数与以前定义函数格式定义一个返回指针值的函数与以前定义函数格式基本类似基本类似,只是只是在函数名前加在函数名前加*,它表明该函数返回一个它表明该函数返回一个指针值指针值,而这个指针值是指向一个而这个指针值是指向一个 int 型数据型数据
13、二、函数返回二、函数返回 指针指针例例:#include#include#define SIZE 100char bufSIZE;char *p=buf;char *alloc(int n)char *begin;if(p+n=buf+SIZE)begin=p;p=p+n;return(begin);else return(NULL);void main()char*p1,*p2;int i;p1=alloc(10);strcpy(p1,”123456789”);p2=alloc(5);strcpy(p2,”abcd”);printf(“buf=%pn”,buf);printf(“p1=%pn
14、”,p1);printf(“p2=%pn”,p2);puts(p1);puts(p2);for(i=0;i15;i+)printf(“%c”,bufi);buf0buf1 :buf9buf10 :buf14buf15 :buf99bufp buf+10p1 p2 mainbeginn allocbufbufbuf+1012:90a:010buf+15beginn allocbuf+105函数的指针函数的指针:函数的入口地址函数的入口地址 在程序执行过程中调用函数时在程序执行过程中调用函数时,计算机会转去执行计算机会转去执行函数体内的语句函数体内的语句,因此计算机必须知道函数在什么地方。因此计算
15、机必须知道函数在什么地方。实际上函数在内存中也要占据一片存储单元实际上函数在内存中也要占据一片存储单元,这片存储这片存储单元一个起始地址单元一个起始地址,我们称其为我们称其为函数的入口地址函数的入口地址,即函数的指针即函数的指针,这个函数的入口地址是用这个函数的入口地址是用函数名函数名来表示。来表示。因此我们可以定义一个指针变量因此我们可以定义一个指针变量,让它的值等于让它的值等于函数的入口地址函数的入口地址,然后可以通过这个指针变量来调用然后可以通过这个指针变量来调用函数函数,该指针变量称为指向函数的指针变量该指针变量称为指向函数的指针变量 三、指向函数的三、指向函数的 指针指针指向函数的指
16、针变量指向函数的指针变量 1.定义格式定义格式:数据类型数据类型 (*指针变量名指针变量名)(形参表列形参表列);int (*pt)(int arr ,int n);说明说明:数据类型数据类型:指针变量所指向的函数的返回值类型指针变量所指向的函数的返回值类型 形参表列形参表列:即指针变量所指向的函数的形参表列即指针变量所指向的函数的形参表列 格式中的小括号不能省略格式中的小括号不能省略 2.应用应用(1)让指针变量指向函数让指针变量指向函数 pt=add;因为函数名为函数的入口地址因为函数名为函数的入口地址,所以直接将函数名所以直接将函数名 赋给指针变量即可赋给指针变量即可 (2)使用指针变量
17、调用函数使用指针变量调用函数 格式格式:(*指针变量名指针变量名)(实参表列实参表列)例例 求一维数组中全部元素的和求一维数组中全部元素的和#include int add(int b ,int n);void main()int a6=1,3,5,7,9,11,total;int (*pt)(int b ,int n);pt=add;total=(*pt)(a,6);printf(“total=%d n”,total);int add(int b ,int n)int i,sum=0;for(i=0;in;i+)sum=sum+bi;return(sum);定义指向函数定义指向函数的指针变量
18、的指针变量令指针变量令指针变量pt 指向函数指向函数add通过通过pt 调用调用函数函数add6.3 指针与数组指针与数组 一一.一维数组与指针一维数组与指针 1.一维数组及元素的地址表示一维数组及元素的地址表示 int a5=1,2,3,4,5 ;数组的地址数组的地址:a 元素元素 地址地址 *a a0&a0 a *(a+1)a1&a1 a+1*(a+2)a2&a2 a+2*(a+3)a3&a3 a+3*(a+4)a4&a4 a+42.用指针变量引用数组元素用指针变量引用数组元素(1)定义指针变量定义指针变量 int *p,a5=1,2,3,4,5 ;p=a;(2)引用数组元素引用数组元素
19、下标法下标法 地址法地址法 指针法指针法第第k个元素个元素 ak*(a+k)*(p+k)第第k个元素的地址个元素的地址&ak a+k p+k 注意注意:指针变量也可以加下标指针变量也可以加下标 pk 等价于等价于 ak 分别用三种方法输出数组元素分别用三种方法输出数组元素,其效率不同其效率不同,下标法与地址法的效率相同下标法与地址法的效率相同,指针法的效率较快指针法的效率较快 用指针变量访问数组元素时要注意下标是否越界用指针变量访问数组元素时要注意下标是否越界 例例:将数组将数组a中全部元素加中全部元素加1,再输出再输出a#include void main()int a5=1,3,5,7,9
20、,*p,j;for(p=a;pa+5;p+)printf(“%3d”,*p);printf(“n”);for(j=0;j5;j+)aj=aj+1;for(j=0;j5;j+)printf(“%3d”,*(p+j);printf(“n”);p=a;1 3 5 7 9aa+1a+2a+3a+4246810p可以用可以用p+,但不能用但不能用a+因为因为a 代表数组的起始地址代表数组的起始地址 它是地址常量它是地址常量,不能改变不能改变 而而p 是一个指针变量是一个指针变量使用指针变量时要注意它的当前值使用指针变量时要注意它的当前值3.指向数组的指针变量作函数参数指向数组的指针变量作函数参数例例6.
21、7 实参和形参都用数组名实参和形参都用数组名#include void inv1(int x ,int n)int temp,i,j,m=(n-1)/2;for(i=0;i=m;i+)j=n-1-i;temp=xi;xi=xj;xj=temp;void main()int i,a6=1,3,4,6,7,9;inv1(a,6);for(i=0;i6;i+)printf(“%3d”,ai);printf(“n”);a0a1a2a3a4a5x0 x1x2x3x4x5134679976431maininv1例例6.7 实参用数组名实参用数组名,形参用指针变量形参用指针变量#include void i
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 指针 详解 课件
限制150内