C语言N06 指针 4学时+2学时

上传人:ni****g 文档编号:577064640 上传时间:2024-08-21 格式:PPT 页数:36 大小:856KB
返回 下载 相关 举报
C语言N06 指针 4学时+2学时_第1页
第1页 / 共36页
C语言N06 指针 4学时+2学时_第2页
第2页 / 共36页
C语言N06 指针 4学时+2学时_第3页
第3页 / 共36页
C语言N06 指针 4学时+2学时_第4页
第4页 / 共36页
C语言N06 指针 4学时+2学时_第5页
第5页 / 共36页
点击查看更多>>
资源描述

《C语言N06 指针 4学时+2学时》由会员分享,可在线阅读,更多相关《C语言N06 指针 4学时+2学时(36页珍藏版)》请在金锄头文库上搜索。

1、第六章第六章 指针指针本章课程共本章课程共6学时学时其中:授课其中:授课4学时,上机学时,上机2学时学时 6.1 指针的基本概念指针的基本概念 变量与地址的概念变量与地址的概念内存内存0000200020012002200320042005内存中每个字节有一个编号内存中每个字节有一个编号地址地址int i; float k; 编译或函数调用时为其分配内存单元编译或函数调用时为其分配内存单元ik变量变量是对程序中数据是对程序中数据存储空间存储空间的抽象的抽象P2208/21/20242 指针与指针变量的概念指针与指针变量的概念 指针指针:一个:一个变量的的地址变量的的地址 指针变量指针变量:专门

2、:专门存放变量地址存放变量地址的的变量变量200020012002200320042005指针指针102000变量变量 i 内容内容i_pointer 内容内容指针变指针变量量变量的地址变量的地址整型变量整型变量 i变量变量 i_pointer8/21/20243 & 与与 * 算符算符含义含义: 取变量的地址取变量的地址单目运算符单目运算符优先级优先级: 2结合性结合性:自右向左自右向左含义含义: 取指针所指向变量的内容取指针所指向变量的内容单目运算符单目运算符优先级优先级: 2结合性结合性:自右向左自右向左两者关系:两者关系:互为逆运算互为逆运算指针变量指针变量 变量地址变量地址(指针指针

3、)变量变量变量值变量值指向指向地址存入地址存入指针变量指针变量i_pointer &i &(*i_pointer)i *i_pointer *(&i)i_pointer = &i = &(*i_pointer)i =*i_pointer =*(&i)i_pointer指针变量,它的指针变量,它的内容是地址量内容是地址量*i_pointer 指针的目标变量,它的指针的目标变量,它的内容是数据内容是数据&i_pointer 指针变量占用指针变量占用内存的地址内存的地址8/21/20244 直接访问与间接访问直接访问与间接访问 直接访问直接访问:用:用变量的地址变量的地址去访问变量值去访问变量值 间

4、接访问间接访问:通过:通过存放变量地址的另外一个变量存放变量地址的另外一个变量去访问变量值去访问变量值200020012002200320042005102000变量变量 i 内容内容i_pointer 内容内容整型变量整型变量 i变量变量 i_pointer例例 i=3; 直接访问直接访问例例 *i_pointer=20; 间接访问间接访问3 208/21/202456.2 指针变量指针变量指针变量指针变量与其与其所指向的变量所指向的变量之间的关系之间的关系2000i_pointer3变量变量i*i_pointeri*i_pointer&ii_pointeri=3*i_pointer=3 指

5、针变量的定义指针变量的定义存储类型存储类型 数据类型数据类型 *指针名指针名;合法标识符合法标识符指针变量本身的存储类型指针变量本身的存储类型指针的目标变量的数据类型指针的目标变量的数据类型表示定义指针变量表示定义指针变量不是不是*运算符运算符例例 int *p1,*p2; float *q ; static char *name; 注意:注意: int *p1, *p2; 与与 int *p1, p2; 指针变量名是指针变量名是p1,p2 ,不是不是*p1,*p2 指针变量只能指针变量只能指向定义时所规定类型指向定义时所规定类型的变量的变量 指针变量定义后,变量值不确定,指针变量定义后,变量

6、值不确定,应用前须先赋值应用前须先赋值P2228/21/20246 指针变量的初始化指针变量的初始化存储类型存储类型 数据类型数据类型 *指针名指针名 = 初始地址;初始地址;赋给指针变量,赋给指针变量,不是赋给目标变量不是赋给目标变量例例 int i; int *p=&i;变量必须已说明过变量必须已说明过类型应一致类型应一致例例 int *p=&i; int i; ()例例 int i; int *p=&i; int *q=p;用已初始化指针变量作初值用已初始化指针变量作初值例例 main( ) int i; static int *p=&i; . ( )不能用不能用auto变量的地址变量的

7、地址去初始化去初始化static型指针型指针8/21/20247 指针变量必须先赋值再使用指针变量必须先赋值再使用main( ) int i=10; int *p; *p=i; printf(“%d”,*p); 危险!危险!main( ) int i=10,k; int *p; p=&k; *p=i; printf(“%d”,*p); 20002001200220032004200510随机值随机值变量变量 i变量变量 p8/21/20248 零指针零指针(NULL)与空类型指针与空类型指针(void) 零指针:零指针:(空指针空指针 NULL) 定义:定义:指针变量值为零指针变量值为零 表示

8、:表示:int * p=0; 注意:注意: (1) p=NULL与与未对未对p赋值赋值不同不同 (2) 用于避免指针变量的非法引用用于避免指针变量的非法引用p指向地址为指向地址为0的单元的单元,系统保证该单元不作它用系统保证该单元不作它用表示指针变量值表示指针变量值没有意义没有意义 空类型指针:空类型指针:(void) 定义:定义:不指定所指向单元数据类型的指针变量不指定所指向单元数据类型的指针变量 表示:表示:void * p; 注意:使用时要进行注意:使用时要进行强制类型转换强制类型转换表示不指定表示不指定p是指向哪一种是指向哪一种类型数据的指针变类型数据的指针变量量例例 char *p1

9、; void *p2; p1=(char *)p2; p2=(void *)p1;8/21/20249 指针变量作为函数参数指针变量作为函数参数地址传递地址传递特点:特点:共享内存共享内存,“双向双向”传递传递例:将数从大到小输出例:将数从大到小输出swap(int x,int y) int temp; temp=x; x=y; y=temp;main( ) int a,b; scanf(%d,%d,&a,&b); if(ab) swap(a,b); printf(n%d,%dn,a,b);值传递2000200230F830FAa: 5b: 9x: 5y: 9mainswapx: 9y: 58

10、/21/202410 指针变量作为函数参数指针变量作为函数参数地址传递地址传递特点:特点:共享内存共享内存,“双向双向”传递传递例:将数从大到小输出例:将数从大到小输出swap(int *p1,int *p2) int temp; temp=*p1; *p1=*p2; *p2=temp;main( ) int a,b; int *p_1, *p_2 scanf(%d,%d,&a,&b); p_1=&a, p_2=&b; if(ab) swap(p_1,p_2); printf(n%d,%dn,a,b);地址传递200020022004200630F830FAmainswapa: 5b: 9p1

11、: 2000p2: 2002p_1: 2000p_2: 2002a: 9b: 5int *temp;*temp=*p1;*p1=*p2;*p2=*temp;int *temp;temp=p1;p1=p2;p2=temp;指针变量在使用前必须赋值!没有改变地址内数据,单向传递8/21/2024116.3 指针与数组指针与数组20001array020021array120042array220063array320085array4200A8array5300A&a0数组名数组名是表示是表示数组首地址数组首地址的的地址常量地址常量数组名:首地址数组名:首地址 如何指向数组元素如何指向数组元素in

12、t array10;int *p;p=&array0; p=array;int *p=&array0;int *p=array;pP2308/21/2024126.3 指针与数组指针与数组数组名数组名是表示是表示数组首地址数组首地址的的地址常量地址常量 指针的运算:指针的运算:赋值赋值运算运算(1) p=&a; (将变量将变量a地址地址 p)(2) p=array; (将数组将数组array首地址首地址 p)(3) p=&arrayi; (将数组第将数组第i元素地址元素地址 p)(4) p1=p2; (指针变量指针变量p2值值 p1)(5) 整型变量整型变量 p (),p值值整型变量整型变量(

13、)20001array020021array120042array220063array320085array4200A8array5300A&a0数组名:首地址数组名:首地址p8/21/2024136.3 指针与数组指针与数组数组名数组名是表示是表示数组首地址数组首地址的的地址常量地址常量 指针的运算:指针的运算:算术算术运算运算20001array020021array120042array220063array320085array4200A8array5300A&a0数组名:首地址数组名:首地址p(1) p i p id (i整型数,变量字节数整型数,变量字节数)(2) p+, p-,

14、 p+i, p-i, p+=i, p-=i 等等(3) 若若p1与与p2指向同一数组,则指向同一数组,则 p1-p2=两指针间元素个数两指针间元素个数(p1-p2)/d(4) p1+p2 无意义无意义8/21/2024146.3 指针与数组指针与数组数组名数组名是表示是表示数组首地址数组首地址的的地址常量地址常量 指针的运算:指针的运算:关系关系运算运算20001array020021array120042array220063array320085array4200A8array5300A&a0数组名:首地址数组名:首地址p(1) p1p2 表示表示p1指的元素在后指的元素在后(3) p1=

15、p2 表示表示p1与与p2指向同一元素指向同一元素(4) 若若p1与与p2指向指向不同数组,比较无意义不同数组,比较无意义(5) p=NULL或或p!=NULL8/21/202415地址地址元素元素取元素取元素array1array0*arrayarray+11array1*(array+1)array+22array2*(array+2)array+33array3*(array+3)array+45array4*(array+4)array+58array5*(array+5)下标法下标法 数组元素的表示方法数组元素的表示方法地址地址元素元素取元素取元素p1p0*pp+11p1*(p+1)

16、p+22p2*(p+2)p+33p3*(p+3)p+45p4*(p+4)p+58p5*(p+5)指针法指针法int array6; int *p = array; 变址运算变址运算符符ai *(a+i)ai pi *(p+i) *(a+i)8/21/202416例例1:int a =1,2,3,4,5,6,7,8,9,10,*p=a,i; 数组元素地址的正确表示:数组元素地址的正确表示:(A) &(a+1) (B) a+ (C) &p (D) &pi 例例2:注意指针变量的运算:注意指针变量的运算 void main() int a =5,8,7,6,2,7,3; int y,*p=&a1;

17、y=(*-p)+; printf(“%d ”,y); printf(“%d”,a0); 输出:输出:5 6例例3:注意指针当前值:注意指针当前值main() int i,*p,a7; p=a; for(i=0;i7;i+) scanf(%d,p+); printf(n); for(i=0;i7;i+,p+) printf(%d,*p);8/21/202417 数组名作为函数参数:数组名作为函数参数:地址传递地址传递例例 将数组将数组a中的中的n个整数按相反顺序存放个整数按相反顺序存放void inv(int x, int n) int t,i,j,m=(n-1)/2; for(i=0;i=m;

18、i+) j=n-1-i; t=xi; xi=xj; xj=t; main() int i,a10=3,7,9,11,0,6,7,5,4,2; inv(a,10); printf(The array has been reverted:n); for(i=0;i10;i+) printf(%d,ai); printf(n);实参用数组实参用数组形参用数组形参用数组8/21/202418 数组名作为函数参数:数组名作为函数参数:地址传递地址传递例例 将数组将数组a中的中的n个整数按相反顺序存放个整数按相反顺序存放void inv(int *x, int n) int t,*p,*i,*j,m=(n

19、-1)/2; i=x; j=x+n-1; p=x+m; for(;i=p;i+,j-) t=*i; *i=*j; *j=t; main() int i,a10=3,7,9,11,0,6,7,5,4,2; inv(a,10); printf(The array has been reverted:n); for(i=0;i10;i+) printf(%d,ai); printf(n);实参用数组实参用数组形参用指针形参用指针8/21/202419 数组名作为函数参数:数组名作为函数参数:地址传递地址传递例例 将数组将数组a中的中的n个整数按相反顺序存放个整数按相反顺序存放void inv(int

20、 *x, int n) int t,*i,*j,*p,m=(n-1)/2; i=x; j=x+n-1; p=x+m; for(;i=p;i+,j-) t=*i; *i=*j; *j=t; main() int i,a10,*p=a; for(i=0;i10;i+,p+) scanf(%d,p); p=a; inv(p,10); printf(The array has been reverted:n); for(p=a;pa+10;p+) printf(%d,*p);实参用指针实参用指针形参用指针形参用指针8/21/202420 数组名作为函数参数:数组名作为函数参数:地址传递地址传递例例 将

21、数组将数组a中的中的n个整数按相反顺序存放个整数按相反顺序存放void 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; main() int i,a10,*p=a; for(i=0;i10;i+,p+) scanf(%d,p); p=a; inv(p,10); printf(The array has been reverted:n); for(p=a;parr+10;p+) printf(%d ,*p);实参用指针实参用指针形参用数组形参用数组8/21/202421 一级指针

22、变量一级指针变量与与一维数组一维数组关系关系 (int *p与与 int q ) q是是指针指针(地址地址)常量常量;p=q时时p+i是是qi的地址的地址 数组元素的表示方法数组元素的表示方法:(p=q时时) 下标法:下标法:piqi 指针法:指针法:*(p+i)*(q+i) 定义时:定义时: 作为形参,作为形参,int q int *q 作为非形参,作为非形参,int *p不能写成不能写成int p 系统分配内存区:系统分配内存区: p分配分配保存一个指针值保存一个指针值的内存区的内存区(一般一般2字节字节) q分配分配2*n字节字节的内存区的内存区8/21/202422 指针变量指针变量与

23、与二维数组二维数组int a34a0a00a01a02a03a1a10a11a12a13a2a20a21a23a230a00a01a012a023a034a10a15a116a127a138a20a29a2110a2211a23每一行每一行 一维数组一维数组首地址:首地址:a1数组名数组名 一维数组一维数组首地址:首地址:aa012a+1a+2 *a=a0*(a+1)=a1*(a+2)=a2a02=*(a0+2)=*(*a+2)a11=*(a1+1)=*(*(a+1)+1)a23=*(a2+3)=*(*(a+2)+3)例例1:地址表示:地址表示(1) a+1 (2) &a10 (3) a1 (

24、4) *(a+1)(5) (int *) (a+1) (6) &a12 (7) a1+2(8) *(a+1)+2 (9) &a00+1*4+2例例2:二维数组元素表示形式:二维数组元素表示形式(1) a12 (2) *(a1+2) (3) *(*(a+1)+2)(4) *(&a00+1*4+2)8/21/202423 二维数组的指针变量二维数组的指针变量 指向指向二维数组元素二维数组元素的指针变量的指针变量main( ) int a34=1,3,5,7,9,11,13,15,17,19,21,23; int *p; for(p=a0;pa0+12;p+) if(p-a0)%4=0) print

25、f(n);printf(%4d ,*p); 0a00a01a012a023a034a10a15a116a127a138a20a29a2110a2211a23012p=*a; p=&a00; p=*(a+0); p=a; p=*a; ( )p=&a00; p=*(a+0); p=a; p=*a; ( )p=&a00; ( )p=*(a+0); p=a; p=*a; ( )p=&a00; ( )p=*(a+0); ( )p=a; p=*a; ( )p=&a00; ( )p=*(a+0); ( )p=a; ()p8/21/202424 二维数组的指针变量二维数组的指针变量 指向指向一维数组一维数组的

26、指针变量的指针变量数据类型数据类型 (*指针名指针名)一维数组长度一维数组长度;例例 int (*p)4;( )不能少不能少int (*p)4与与int *p4不同不同int (*p)4 指向数组的指针指向数组的指针int *p4存储地址存储地址(指针指针)的数组的数组p的值是的值是一维数组一维数组的首地址的首地址可让可让p指向二维数组某一行指向二维数组某一行如如 int a34, (*p)4=a;一维数组指针变量维数和一维数组指针变量维数和二维数组列数二维数组列数必须相同必须相同0a00a01a012a023a034a10a15a116a127a138a20a29a2110a2211a230

27、12p+1pp+2main() int a34=1,3,5,7,9,11,13,15,17,19,21,23; int i,j,(*p)4; for(p=a,i=0;i3;i+,p+) for(j=0;j4;j+) printf(%d ,*(*p+j);printf(n); p=a0; p=*a; p=&a00; p=&a0; p=a0; () p=*a; p=&a00; p=&a0; p=a0; () p=*a; ()p=&a00; p=&a0; p=a0; () p=*a; ()p=&a00; ()p=&a0; p=a0; () p=*a; ()p=&a00; ()p=&a0; ( )8/

28、21/202425 二维数组的指针作为函数的参数二维数组的指针作为函数的参数例:例:3个学生各学个学生各学4门课,计算总平均分,并输出第门课,计算总平均分,并输出第n个学生成绩个学生成绩main() void average(float *p,int n); void search(float (*p)4,int n); float score34=,; average(*score,12); search(score,2);void average(float *q,int n) float *q_end, sum=0,aver; q_end=q+n-1; for(;q=q_end;q+)s

29、um=sum+(*q); aver=sum/n; printf(average=%5.2fn,aver);void search(float (*p)4, int n) int i; printf( No.%d :n,n); for(i=0;iy?x:y);min(int x,int y) printf(“min=”); return(xy?x:y);add(int x,int y) printf(“sum=”); return(x+y);2000max3000min4000add8/21/202430例例 用指针函数用指针函数,给定学生序号输出学生全部成绩,给定学生序号输出学生全部成绩mai

30、n() float score4=60,70,80,90, 56,89,67,88,34,78,90,66; float *search(float (*pointer)4,int n), *p; int i,m; printf(Enter the number of student:); scanf(%d,&m); printf(The scores of No.%d are:n,m); p=search(score,m); for(i=0;i4;i+) printf(%5.2ft,*(p+i);float *search(float (*pointer)4, int n) float *p

31、t; pt=*(pointer+n); return(pt);pointerpointer+1347890665689678860708090score数组数组8/21/2024316.6 指针数组与多级指针指针数组与多级指针 指针数组:指针数组: 定义:数组中存储元素为指针的数组定义:数组中存储元素为指针的数组 用途:处理二维数组或多个字符串用途:处理二维数组或多个字符串存储类型存储类型 数据类型数据类型 *数组名数组名数组长度说明数组长度说明;指针所指向变量的数据类型指针所指向变量的数据类型指针本身的存储类型指针本身的存储类型区分区分int *p4与与int (*p)4赋值赋值:main(

32、 ) int b23,*pb2; pb0=b0; pb1=b1; .int *pb2pb0pb1int b23123246初始化初始化:main() int b23,*pb =b0,b1; .int *pb2pb0pb1int b23123246P2778/21/202432 二维数组与指针数组区别二维数组与指针数组区别 char name59=“gain”,“much”,“stronger”, “point”,“bye”; char *name5=“gain”,“much”,“stronger”, “point”,“bye”; 二维数组存储空间固定二维数组存储空间固定 字符指针数组相当于可变

33、列长的二维数组字符指针数组相当于可变列长的二维数组 分配内存单元分配内存单元=数组维数数组维数*2+各字符串长度各字符串长度 指针数组元素的作用相当于二维数组的行名指针数组元素的作用相当于二维数组的行名 指针数组中元素是指针变量,二维数组的行名是地址常量指针数组中元素是指针变量,二维数组的行名是地址常量8/21/202433 多级指针多级指针(指向指针变量的指针指向指针变量的指针) 一级指针:指针变量中存放一级指针:指针变量中存放目标变量目标变量的的地址地址 二级指针:指针变量中存放二级指针:指针变量中存放一级指针变量一级指针变量的的地址地址 多级指针:多级指针:int *p; (三级三级)

34、float *p; (四级四级)例例 int *p; int i=3; p=&i; *p=5;&i3p(指针变量指针变量)i(整型变量整型变量)一级指针一级指针单级间接寻址单级间接寻址p1&p2&i3P2(指针变量指针变量)i(整型变量整型变量)例例 int *p1; int *p2; int i=3; p2=&i; p1=&p2; *p1=5;二级指针二级指针一级指针一级指针目标变量目标变量二级间接寻址二级间接寻址例例 int i, *p; p=&i; ( ) p是二级指针,不能用变量地址为其赋值是二级指针,不能用变量地址为其赋值8/21/202434 二级指针二级指针与与指针数组指针数组关系:关系:int *p与与int *q10 指针数组名指针数组名是是二级指针常量二级指针常量 p=q; p+i 是是qi的地址的地址 定义形式:定义形式: 作为形参,作为形参,int *q 与与int *q完全等价完全等价 作为变量定义两者不同作为变量定义两者不同 内存分类配:内存分类配: p分配能保存一个指针值的内存区分配能保存一个指针值的内存区 q分配分配10块内存区,每块可保存一个指针值块内存区,每块可保存一个指针值8/21/202435本章小结:本章小结: 指针的数据类型指针的数据类型8/21/202436

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 建筑/环境 > 施工组织

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号