《C语言 指针应用.ppt》由会员分享,可在线阅读,更多相关《C语言 指针应用.ppt(22页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第第第第7 7 7 7章章章章 指指指指 针针针针2023/1/262内容提要内容提要内容提要内容提要 指针的概念指针的概念指针的概念指针的概念 数组的下标法引用和指针法引用数组的下标法引用和指针法引用数组的下标法引用和指针法引用数组的下标法引用和指针法引用 利用指针数组对各个字符串进行排序利用指针数组对各个字符串进行排序利用指针数组对各个字符串进行排序利用指针数组对各个字符串进行排序,存取等操存取等操存取等操存取等操作作作作 带参数的带参数的带参数的带参数的main()main()函数函数函数函数2023/1/263指针概述指针概述指针概述指针概述 指针的概念指针的概念指针的概念指针的概念
2、一、什么是变量的地址,什么是变量的内容?一、什么是变量的地址,什么是变量的内容?一、什么是变量的地址,什么是变量的内容?一、什么是变量的地址,什么是变量的内容?每个变量在内存中都占有一定字节数目的存储每个变量在内存中都占有一定字节数目的存储每个变量在内存中都占有一定字节数目的存储每个变量在内存中都占有一定字节数目的存储单元,单元,单元,单元,C C编译程序在对程序编译时,根据程序编译程序在对程序编译时,根据程序编译程序在对程序编译时,根据程序编译程序在对程序编译时,根据程序中定义的变量的类型,在内存中为其分配相应中定义的变量的类型,在内存中为其分配相应中定义的变量的类型,在内存中为其分配相应中
3、定义的变量的类型,在内存中为其分配相应字节数目的存储空间。字节数目的存储空间。字节数目的存储空间。字节数目的存储空间。变量在内存中所占存储空间的首地址,就称为变量在内存中所占存储空间的首地址,就称为变量在内存中所占存储空间的首地址,就称为变量在内存中所占存储空间的首地址,就称为该变量的地址(该变量的地址(该变量的地址(该变量的地址(addressaddress).变量在内存中所占存储单元中存放的数据,就变量在内存中所占存储单元中存放的数据,就变量在内存中所占存储单元中存放的数据,就变量在内存中所占存储单元中存放的数据,就称为变量的内容(称为变量的内容(称为变量的内容(称为变量的内容(conte
4、ntcontent)。)。)。)。2023/1/264 直接寻址直接寻址直接寻址直接寻址 间接寻址间接寻址间接寻址间接寻址 指针变量指针变量指针变量指针变量 专门存放地址型数据的变量专门存放地址型数据的变量专门存放地址型数据的变量专门存放地址型数据的变量 运算符运算符运算符运算符&和和和和*的使用的使用的使用的使用&(*&(*p1)/*p1)/*该表达式的值代表的是变量该表达式的值代表的是变量该表达式的值代表的是变量该表达式的值代表的是变量a a 的地址的地址的地址的地址*/*/*(&*(&a)/*a)/*该表达式引用的是变量该表达式引用的是变量该表达式引用的是变量该表达式引用的是变量a a的
5、内的内的内的内 容容容容*/*/2023/1/265 引入指针的原因引入指针的原因引入指针的原因引入指针的原因 为函数提供修改变量值的手段为函数提供修改变量值的手段为函数提供修改变量值的手段为函数提供修改变量值的手段 指针为指针为指针为指针为C C的动态内存分配系统提供支持的动态内存分配系统提供支持的动态内存分配系统提供支持的动态内存分配系统提供支持 指针为动态数据结构提供支持指针为动态数据结构提供支持指针为动态数据结构提供支持指针为动态数据结构提供支持 指针可以改善某些子程序的效率指针可以改善某些子程序的效率指针可以改善某些子程序的效率指针可以改善某些子程序的效率例例例例:任任任任意意意意从
6、从从从键键键键盘盘盘盘输输输输入入入入两两两两个个个个整整整整数数数数,然然然然后后后后将将将将交交交交换换换换后后后后的的的的数数数数据据据据重重重重新新新新输输输输出。出。出。出。2023/1/266#include#include.hvoid swap(void swap(int int x,x,intint y);y);main()main()intint a,b;a,b;printfprintf(“Please enter a,b:”);(“Please enter a,b:”);scanfscanf(“%d,%d”,&a,&b);(“%d,%d”,&a,&b);printfprin
7、tf(“Before swap:a=%d,b=%dn”,a,b);(“Before swap:a=%d,b=%dn”,a,b);swap(a,b);swap(a,b);printfprintf(“After swap:a=%d,b=%dn”,a,b);(“After swap:a=%d,b=%dn”,a,b);void swap(void swap(int int x,x,int int y)y)intint temp;temp;temp=x;x=y;y=temp;temp=x;x=y;y=temp;仔仔仔仔细细细细分分分分析析析析,是是是是否否否否成成成成功功功功交交交交换换换换?2023/
8、1/267变量的指针作为函数参数变量的指针作为函数参数变量的指针作为函数参数变量的指针作为函数参数 变量指针变量指针变量指针变量指针 指针变量指针变量指针变量指针变量 变量的指针就是变量的地址,变量的指针就是变量的地址,变量的指针就是变量的地址,变量的指针就是变量的地址,指针变量就是指针变量就是指针变量就是指针变量就是C C语言中专门用于存放地址型数据的语言中专门用于存放地址型数据的语言中专门用于存放地址型数据的语言中专门用于存放地址型数据的变量变量变量变量 指针变量的定义指针变量的定义指针变量的定义指针变量的定义 类型关键字类型关键字 *指针变量名;指针变量名;例例:1):1)intint*
9、p1,*p2;*p1,*p2;2)2)intint a,b;a,b;intint*p1=&a,*p2=&b;*p1=&a,*p2=&b;2023/1/268指针变量的运算指针变量的运算指针变量的运算指针变量的运算1 1)指针变量的内容只能是地址,而不能是数据,)指针变量的内容只能是地址,而不能是数据,)指针变量的内容只能是地址,而不能是数据,)指针变量的内容只能是地址,而不能是数据,必须用相同基类型的变量的地址对其进行赋值;必须用相同基类型的变量的地址对其进行赋值;必须用相同基类型的变量的地址对其进行赋值;必须用相同基类型的变量的地址对其进行赋值;2 2)指指指指针针针针变变变变量量量量必必必
10、必须须须须经经经经初初初初始始始始化化化化后后后后才才才才能能能能使使使使用用用用,否否否否则则则则指指指指针针针针变变变变量量量量所所所所指指指指向向向向的的的的存存存存储储储储单单单单元元元元是是是是不不不不确确确确定定定定的的的的,对对对对其其其其所所所所作的赋值等操作将是很危险的。作的赋值等操作将是很危险的。作的赋值等操作将是很危险的。作的赋值等操作将是很危险的。3 3)由由由由于于于于指指指指针针针针的的的的值值值值就就就就是是是是地地地地址址址址,指指指指针针针针运运运运算算算算实实实实质质质质上上上上就就就就是对地址的运算。是对地址的运算。是对地址的运算。是对地址的运算。指指指指
11、针针针针运运运运算算算算只只只只能能能能参参参参与与与与赋赋赋赋值值值值运运运运算算算算、算算算算术术术术运运运运算算算算和和和和关关关关系系系系运运运运算算算算。其其其其中中中中,指指指指针针针针可可可可参参参参与与与与的的的的算算算算术术术术运运运运算算算算值值值值有有有有两两两两种种种种:加和减,即加、减一个整数或自增、自减运算。加和减,即加、减一个整数或自增、自减运算。加和减,即加、减一个整数或自增、自减运算。加和减,即加、减一个整数或自增、自减运算。2023/1/269 分析分析:a=*p+;a=*p+;a=*p;p=p+1;a=*p;p=p+1;a=(*p)+;a=(*p)+;a=
12、*p;*p=*p+1;a=*p;*p=*p+1;2023/1/2610重新解决问题重新解决问题重新解决问题重新解决问题#include#include.hvoid swap(void swap(intint*x,*x,int int *y);*y);main()main()intint a,b;a,b;printfprintf(“Please enter a,b:”);(“Please enter a,b:”);scanfscanf(“%d,%d”,&a,&b);(“%d,%d”,&a,&b);printfprintf(“Before swap:a=%d,b=%dn”,a,b);(“Befor
13、e swap:a=%d,b=%dn”,a,b);swap(&a,&b);swap(&a,&b);printfprintf(“After swap:a=%d,b=%dn”,a,b);(“After swap:a=%d,b=%dn”,a,b);void swap(void swap(int int *x,*x,intint*y)*y)intint temp;temp;temp=*x;*x=*y;*y=temp;temp=*x;*x=*y;*y=temp;2023/1/2611字符指针作函数参数字符指针作函数参数字符指针作函数参数字符指针作函数参数 字符数组与字符指针的不同字符数组与字符指针的不同字
14、符数组与字符指针的不同字符数组与字符指针的不同 1 1)定)定)定)定义义方法不同;方法不同;方法不同;方法不同;charchar str str10;10;定定定定义义的是一个字符数的是一个字符数的是一个字符数的是一个字符数组组,而,而,而,而 char*char*ptrptr;定定定定义义的是一个字符指的是一个字符指的是一个字符指的是一个字符指针针。2 2)初始化含)初始化含)初始化含)初始化含义义不同;不同;不同;不同;charchar str str10=“China”;10=“China”;char*char*ptrptr=”China”;=”China”;2023/1/2612 3
15、 3)赋值赋值方法和含方法和含方法和含方法和含义义不同;不同;不同;不同;指指指指针变针变量可以用如下方式量可以用如下方式量可以用如下方式量可以用如下方式赋值赋值:char*char*ptrptr;ptrptr=”China”;/*=”China”;/*正确正确正确正确*/*/charchar str str10;10;strstr=”China”;/*=”China”;/*错误错误*/*/strcpystrcpy(strstr,”China”);,”China”);2023/1/2613 4 4)输输入字符串入字符串入字符串入字符串时时略有不同。略有不同。略有不同。略有不同。用用用用scan
16、fscanf语语句句句句输输入字符串到数入字符串到数入字符串到数入字符串到数组组中,用中,用中,用中,用charchar str str10;10;scanfscanf(“%s”,(“%s”,strstr););而用字符指而用字符指而用字符指而用字符指针输针输入字符串入字符串入字符串入字符串时时,必,必,必,必须须确保字符指确保字符指确保字符指确保字符指针针事先已指向了一个数事先已指向了一个数事先已指向了一个数事先已指向了一个数组组的首地址,即的首地址,即的首地址,即的首地址,即charchar str str10,*10,*ptrptr;ptrptr=strstr;scanfscanf(“%
17、s”,(“%s”,ptrptr);/*);/*正确正确正确正确*/*/而而而而char*char*ptrptr;scanfscanf(“%s”,(“%s”,ptrptr);/*);/*错误错误*/*/2023/1/2614 5 5)字字字字符符符符数数数数组组的的的的数数数数组组名名名名是是是是一一一一个个个个地地地地址址址址常常常常量量量量,它它它它的的的的值值是是是是不不不不能能能能改改改改变变的的的的,而而而而字字字字符符符符指指指指针针是是是是一一一一个个个个变变量量量量,它它它它的的的的值值是是是是可可可可以改以改以改以改变变的。的。的。的。for(for(ptrptr=strstr
18、;*;*ptrptr!=0;!=0;ptrptr+)+)printf printf(“%c”,*(“%c”,*ptrptr););2023/1/2615指针和数组间的关系指针和数组间的关系指针和数组间的关系指针和数组间的关系 一维数组的地址和指针一维数组的地址和指针一维数组的地址和指针一维数组的地址和指针数数数数组组的指的指的指的指针针:指数:指数:指数:指数组组的起始地址。的起始地址。的起始地址。的起始地址。指向数指向数指向数指向数组组的指的指的指的指针变针变量:量:量:量:intint a9;a9;int int p;p;p=&a0;(p=&a0;(或或或或 p=a;)p=a;)通通通通过
19、过指指指指针针引用数引用数引用数引用数组组元素元素元素元素main()main()int int a10,*p;a10,*p;for(p=a;pa+10;p+)for(p=a;pa+10;p+)scanf scanf(“%d”,p);(“%d”,p);for(p=a;pa+10;p+)for(p=a;pa+10;p+)printf printf(“%d”,*p);(“%d”,*p);可有五种引用数组元素的方法可有五种引用数组元素的方法可有五种引用数组元素的方法可有五种引用数组元素的方法2023/1/2616 二维数组的地址和指针二维数组的地址和指针二维数组的地址和指针二维数组的地址和指针行地址
20、和列地址行地址和列地址行地址和列地址行地址和列地址 1 1)aijaij 2 2)*(ai+j)*(ai+j)3 3)*(*(a+i)+j)*(*(a+i)+j)4 4)(*(a+i)j(*(a+i)j行行行行指针和列指针指针和列指针指针和列指针指针和列指针定义行指针定义行指针定义行指针定义行指针:类型类型类型类型 (*(*行指针名行指针名行指针名行指针名)常量常量常量常量 nn定义列指针定义列指针定义列指针定义列指针:int int*p;(*p;(例题例题例题例题)2023/1/2617指针数组指针数组指针数组指针数组指指指指针针数数数数组组:类类型名型名型名型名*数数数数组组名名名名 数数
21、数数组长组长度度度度 如:如:如:如:intint*p4;*p4;2023/1/2618例题例题例题例题:编编程将若干字符串按字母程将若干字符串按字母程将若干字符串按字母程将若干字符串按字母顺顺序由小到大排序后序由小到大排序后序由小到大排序后序由小到大排序后输输出。出。出。出。#include include.h#include#includemain()main()intint i,j;i,j;char*temp;char*temp;char char ptrptr5=“Pascal”,”Basic”,”Fortran”,”Java”,5=“Pascal”,”Basic”,”Fortran”
22、,”Java”,”Visual C”;”Visual C”;printf printf(“Before sorted:n”);(“Before sorted:n”);for(i=0;i5;i+)puts(for(i=0;i5;i+)puts(ptrptri);/*i);/*输输出排序前出排序前出排序前出排序前 的的的的5 5个字符串个字符串个字符串个字符串*/*/2023/1/2619for(i=0;i4;i+)/*for(i=0;i4;i+)/*交交交交换换法排序法排序法排序法排序*/*/for(j=i+1;j5;j+)for(j=i+1;j5;j+)if(if(strcmpstrcmp(p
23、trptrj,j,ptrptri)0)/*i)0)/*若若若若字符串小于字符串小于字符串小于字符串小于ptrptrii所指字符串所指字符串所指字符串所指字符串*/*/temp=temp=ptrptri;i;/*/*则则交交交交换换指指指指针变针变量量量量 ptrptrjj和和和和ptrptrii的指向的指向的指向的指向*/*/ptrptri=i=ptrptrj;j;ptr ptrj=temp;j=temp;printfprintf(“After sorted:n”);(“After sorted:n”);for(i=0;i5;i+)puts(for(i=0;i1)1)printf printf
24、(“The other arguments is following:n”);(“The other arguments is following:n”);for(i=1;i for(i=1;iargcargc;i+);i+)printf printf(“%sn”,(“%sn”,argvargvi);i);2023/1/2622运行程序运行程序运行程序运行程序假定上面程序的文件名是假定上面程序的文件名是假定上面程序的文件名是假定上面程序的文件名是echo.cecho.c,则则在程序成功在程序成功在程序成功在程序成功编译编译和和和和连连接后(接后(接后(接后(编译连编译连接后的程序名接后的程序名
25、接后的程序名接后的程序名为为echo.exeecho.exe),),),),我我我我们们可按可按可按可按如下命令行方式运行如下命令行方式运行如下命令行方式运行如下命令行方式运行这这个程序:个程序:个程序:个程序:echo programming is funecho programming is fun 则则程序将程序将程序将程序将显显示示示示结结果如下:果如下:果如下:果如下:The number of command line arguments is:4The number of command line arguments is:4The program name is:echo.exeThe program name is:echo.exeThe other arguments is following:The other arguments is following:programmingprogrammingis isfunfun
限制150内