最全的C语言指针详解.ppt
《最全的C语言指针详解.ppt》由会员分享,可在线阅读,更多相关《最全的C语言指针详解.ppt(47页珍藏版)》请在三一办公上搜索。
1、第6章 指针,6.1 指针定义与使用6.2 指针与函数6.3 指针与数组6.4 指针与字符串6.5 指针数组与多级指针6.6 指针与动态内存分配6.7 指针的深层应用,6.1 指针的引出,一.地址与指针 1.地址与取地址运算 C程序中的变量在内存中占有一个可标识的存储区,每一个存储区是由若干个字节组成,每一个字节都有 自己的地址,而一个存储区的 地址是指该存储区中 第一个字节的地址,C语言允许在程序中使用变量的地址(通过地址运算符 数组变量 a 的地址-数组名 a,2.指针与指针变量(1)变量的访问方式 直接访问:通过变量名或地址访问变量的存储区 例:scanf(“%d”,间接访问:将一个变量
2、的地址存放在另一个变量中.如将变量 x 的地址存放在 变量p 中,访问x 时先找到p,再由p 中存放的地址找到 x,2012,1010,1010,(2)指针:一个变量的指针就是该变量的地址(指针就是地址)(3)指针变量:存放变量地址的变量,它用来指向另一个变量,二、指针变量的定义1.格式:数据类型*指针变量名;例 int*p1;char*p2;,2.说明:(1)在变量定义时,*号表示该变量是指针变量(注意:指针变量是p1,p2,不是*p1,*p2)(2)定义指针变量后,系统为其分配存储空间,用以存放 其他变量的地址,但在对指针变量赋值前,它并没有 确定的值,也不指向一个确定的变量,例:int
3、x,*p;x=5;,2012,1010,5,1234,注:指针变量p的值是随机值,此时p 和 x 并无关联,(3)使指针变量指向一个确定的变量必须进行赋值,int x,*p;x=5;p=,2012,1010,5,1010,三、指针变量的引用 1.指针运算符*(1)p与*p不同,p是指针变量,p的值是p所指向的变量的地址*p 是p 所指向的变量,*p的值是p所指向的变量的值,*p 的值为 5(*p 表示 x),而p 的值为 1010,(2)引用指针变量时的*与 定义指针变量时的*不同 定义变量时的*只是表示其后的变量是指针变量,int a,*p;p=,2012,1010,5,1010,12,让p
4、指向a,对a 重新赋值等价于 a=12,即&a,2.,*&a*(&a)*p a,&*p&(*p)&a,3.*与+,-int a=2,b=5,c,d,*p;,p 的值为a 的地址,*p 的值为2p 的值不变,*p 的值为 3,(2)c=*p+;,c=*(p+);c=*p;p+;执行后 c 的值为 3,*p 的值为 5,(3)d=*+p;,d=*(+p);+p;d=*p;执行后 d 的值为 3,*p 的值为 3,2012,1010,1010,(1)p=,(等价于 a+;),1012,3,3,1014,3,例6.2#include void main()int*p1,*p2,*p,a,b;scanf
5、(“%d%d”,&a,&b,&a,&b,&a,5,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”,5,说明:该程序不能实现a 和b 的交换因为实参a,b 对形参x,y 是“值传递”,x 和y 的变化不影响a 和b 所以输出为:a=5,b=9,9,main,swap,5,5,9,9,5,6.2 指针与函数,例 6.3#include void swap1(int*p1
6、,int*p2)int temp;temp=*p1;*p1=*p2;*p2=temp;void main()int a,b,*pt1,*pt2;scanf(“%d%d”,&b,&a,5,说明:这种方法是交换p1和p2所指向的变量的值,即交换main函数中a 和b的值所以输出为:a=9,b=5,main,swap1,5,9,&a,&b,9,5,例 6.3#include void swap2(int*p1,int*p2)int*temp;*temp=*p1;*p1=*p2;*p2=*temp;,说明:这种方法可能会破坏系统的正常工作状态,因为temp是一个指针变量但是在函数中并没有给temp一个
7、确定的地址,这样它所指向的内存单元是不可预见的,而对*temp的赋值可能带来危害,main,&a,&b,&b,&a,swap2,?,随机值,5,5,9,5,9,例 6.3#include void swap3(int*p1,int*p2)int*p;p=p1;p1=p2;p2=p;,&a,&a,&b,这种方法是交换形参p1和p2的值,使它们的指向发生改变,但是main函数中的a和b的值并没有进行交换所以输出为:a=5,b=9,&b,&a,swap3,前面我们用到的函数,有些无返回值,有些有返回值,返回值 类型多为 int,float,char.一个函数的返回值也可以是一个指针 类型的数据(即地
8、址),定义函数:数据类型*函数名(形参表列)函数体;例:int*fun(int a,int b)函数体;说明:定义一个返回指针值的函数与以前定义函数格式基本类似,只是在函数名前加*,它表明该函数返回一个指针值,而这个指针值是指向一个 int 型数据,二、函数返回 指针,例:#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*
9、p1,*p2;int i;p1=alloc(10);strcpy(p1,”123456789”);p2=alloc(5);strcpy(p2,”abcd”);printf(“buf=%pn”,buf);printf(“p1=%pn”,p1);printf(“p2=%pn”,p2);puts(p1);puts(p2);for(i=0;i15;i+)printf(“%c”,bufi);,buf0buf1:buf9buf10:buf14buf15:buf99,buf+10,buf,buf,buf+10,12:90,a:0,10,buf+15,buf+10,5,函数的指针:函数的入口地址 在程序执行过
10、程中调用函数时,计算机会转去执行函数体内的语句,因此计算机必须知道函数在什么地方。实际上函数在内存中也要占据一片存储单元,这片存储单元一个起始地址,我们称其为函数的入口地址,即函数的指针,这个函数的入口地址是用函数名来表示。因此我们可以定义一个指针变量,让它的值等于函数的入口地址,然后可以通过这个指针变量来调用函数,该指针变量称为指向函数的指针变量,三、指向函数的 指针,指向函数的指针变量 1.定义格式:数据类型(*指针变量名)(形参表列);int(*pt)(int arr,int n);说明:数据类型:指针变量所指向的函数的返回值类型 形参表列:即指针变量所指向的函数的形参表列 格式中的小括
11、号不能省略,2.应用(1)让指针变量指向函数 pt=add;因为函数名为函数的入口地址,所以直接将函数名 赋给指针变量即可(2)使用指针变量调用函数 格式:(*指针变量名)(实参表列),例 求一维数组中全部元素的和#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
12、+bi;return(sum);,定义指向函数的指针变量,令指针变量pt 指向函数add,通过pt 调用函数add,6.3 指针与数组,一.一维数组与指针 1.一维数组及元素的地址表示 int a5=1,2,3,4,5;数组的地址:a,2.用指针变量引用数组元素(1)定义指针变量 int*p,a5=1,2,3,4,5;p=a;,(2)引用数组元素,注意:指针变量也可以加下标 pk 等价于 ak 分别用三种方法输出数组元素,其效率不同,下标法与地址法的效率相同,指针法的效率较快 用指针变量访问数组元素时要注意下标是否越界,例:将数组a中全部元素加1,再输出a#include void main(
13、)int a5=1,3,5,7,9,*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;,aa+1a+2a+3a+4,2,4,6,8,10,可以用p+,但不能用a+因为a 代表数组的起始地址 它是地址常量,不能改变 而p 是一个指针变量,使用指针变量时要注意它的当前值,3.指向数组的指针变量作函数参数,例6.7 实参和形参都用数组名#include void inv1(int x,int n)int t
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 指针 详解

链接地址:https://www.31ppt.com/p-4915475.html