好文档就是一把金锄头!
欢迎来到金锄头文库![会员中心]
电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本

滇西科技师范学院《C语言程序设计》课件-第8章 善于利用指针.pptx

213页
  • 卖家[上传人]:zjm****gmk
  • 文档编号:309790557
  • 上传时间:2022-06-13
  • 文档格式:PPTX
  • 文档大小:914.06KB
  • / 213 举报 版权申诉 马上下载
  • 文本预览
  • 下载提示
  • 常见问题
    • 第第8章章 善于利用指针善于利用指针8.1指指针针是什么是什么8.2指针变量指针变量8.3通过指针引用数组通过指针引用数组8.4通过指针引用字符串通过指针引用字符串8.5指向函数的指针指向函数的指针8.6返回指针值的函数返回指针值的函数8.7指针数组和多重指针指针数组和多重指针8.8动态内存分配与指向它的指针变量动态内存分配与指向它的指针变量8.9有关指针的小结有关指针的小结滇西科技师范学院C语言程序设计8.1 指針是什么指針是什么如果在程序中定义了一个变量,在对程序进如果在程序中定义了一个变量,在对程序进行编译时,系统就会给行编译时,系统就会给该该变量分配内存单元变量分配内存单元编译系统根据程序中定义的变量类型,分配编译系统根据程序中定义的变量类型,分配一定长度的空间一定长度的空间例如,例如,VC+为整型变量分配为整型变量分配4个字节,对个字节,对单精度浮点型变量分配个字节,对字符型单精度浮点型变量分配个字节,对字符型变量分配个字节变量分配个字节8.1 指针指针是什么是什么内存区的每一个字节有一个编号,这就是内存区的每一个字节有一个编号,这就是“地址地址”,它相当于旅馆中的房间号它相当于旅馆中的房间号。

      在地址所标在地址所标识识的内存单元中存放数据,这相的内存单元中存放数据,这相当于旅馆房间中居住的旅客一样当于旅馆房间中居住的旅客一样由于通过地址能找到所需的变量单元,我们由于通过地址能找到所需的变量单元,我们可以说,可以说,地址指向该变量单元地址指向该变量单元将地址形象化地称为将地址形象化地称为“指针指针”务必弄清楚存储单元的务必弄清楚存储单元的地址地址和存储和存储单元的单元的内容内容这两个概念的区别这两个概念的区别例如:例如:inti=3,j=6,k;printf(“%d”,i);通过变量名通过变量名i找到找到i的地址的地址2000,从而,从而从从存存储单元储单元读读取取3inti=3,j=6,k;k=i+j;从这里取从这里取3将将9送到这里送到这里从这里取从这里取6直接存取直接存取inti=3,j=6,k;定义特殊变量定义特殊变量i_pointer将将i的地址的地址存到这里存到这里间接存取间接存取i_pointer=&i;*i_pointer=50;5050i200032000i_pointer*i_pointer20003直接存取直接存取间接存取间接存取为了表示将数值送到变量中,可以有两为了表示将数值送到变量中,可以有两种表达方法:种表达方法:(1)将将3直接送到变量直接送到变量i所标识的单元中,例所标识的单元中,例如:如:i=3;(2)将将3送到变量送到变量i_pointer所指向的单元所指向的单元(即变量(即变量i的存储单元),例如:的存储单元),例如:*i_pointer=3;其中其中*i_pointer表示表示i_pointer指向的对象指向的对象指向就是通过地址来体现的指向就是通过地址来体现的u假设假设i_pointer中的值是变量的地址中的值是变量的地址(2000),这样就在,这样就在i_pointer和变量之间和变量之间建立起一种联系,即通过建立起一种联系,即通过i_pointer能知道能知道i的地址,从而找到变量的地址,从而找到变量i的内存单元的内存单元由于通过地址能找到所需的变量单元,因由于通过地址能找到所需的变量单元,因此说,地址指向该变量单元此说,地址指向该变量单元将地址形象化地称为将地址形象化地称为“指针指针”。

      意思是通意思是通过它能找到以它为地址的内存单元过它能找到以它为地址的内存单元一个变量的一个变量的地址地址称为该变量的称为该变量的“指针指针”例如,地址例如,地址2000是变量的指针是变量的指针如果有一个变量专门用来存放另一变量的如果有一个变量专门用来存放另一变量的地址(即指针),则它称为地址(即指针),则它称为“指针变量指针变量”i_pointer就是一个指针变量指针变量就是一个指针变量指针变量就是地址变量,用来存放地址的变量,指就是地址变量,用来存放地址的变量,指針变量的值是地址(即指针)針变量的值是地址(即指针)“指针指针”和和“指针变量指针变量”是是不同的不同的概念概念可以说变量可以说变量i的指针是的指针是2000,而不能说,而不能说i的的指针变量是指针变量是2000指针是一个地址,而指针变量是存放地址指针是一个地址,而指针变量是存放地址的变量的变量8.2 指针变量指针变量8.2.1使用指针变量的例子使用指针变量的例子8.2.2怎样定义指针变量怎样定义指针变量8.2.3怎样引用指针变量怎样引用指针变量8.2.4指针变量作为函数参数指针变量作为函数参数8.2.1使用指针变量的例子使用指针变量的例子例例8.1通通过指针变量访问整型变量。

      过指针变量访问整型变量解题思路:先定义解题思路:先定义2个整型变量,再定个整型变量,再定义义2个指针变量,分别指向这两个整型个指针变量,分别指向这两个整型变量,通过访问指针变量,可以找到它变量,通过访问指针变量,可以找到它们所指向的变量,从而得到这些变量的们所指向的变量,从而得到这些变量的值includeintmain()inta=100,b=10;int*pointer_1,*pointer_2;pointer_1=&a;pointer_2=&b;printf(“a=%d,b=%dn”,a,b);printf(“*pointer_1=%d,*pointer_2=%dn”,*pointer_1,*pointer_2);return0;定义两个指针变量定义两个指针变量使使pointer_1指向指向a使使pointer_2指向指向b直接直接输出变量输出变量a和和b的值的值间接间接输出变量输出变量a和和b的值的值#includeintmain()inta=100,b=10;int*pointer_1,*pointer_2;pointer_1=&a;pointer_2=&b;printf(“a=%d,b=%dn”,a,b);printf(“*pointer_1=%d,*pointer_2=%dn”,*pointer_1,*pointer_2);return0;此处此处*与与类型名类型名在一起。

      在一起此时共同定义指针变量此时共同定义指针变量此处此处*与指针变量一起使用此与指针变量一起使用此时时代表指针变量所指向的变量代表指针变量所指向的变量8.2.2 怎样定义指针变量怎样定义指针变量定义指针变量的一般形式为:定义指针变量的一般形式为:类型类型*指针变量名指针变量名;如:如:int*pointer_1,*pointer_2;uint是是为为指针变量指定的指针变量指定的“基类型基类型”u基类型指定指针变量可指向的变量类型基类型指定指针变量可指向的变量类型u如如pointer_1可以指向整型变量,但不能指可以指向整型变量,但不能指向浮点型变量向浮点型变量8.2.2 怎样定义指针变量怎样定义指针变量下面都是合法的定义下面都是合法的定义和初始化和初始化:float*pointer_3;char*pointer_4;inta,b;int*pointer_1=&a,*pointer_2=&b;*pointer_1&a;错误错误pointer_3&a;错误错误pointer_1&a;正确正确pointer_32000;错误错误8.2.3 怎样引用指针变量怎样引用指针变量在引用指针变量时,可能有三种情况:在引用指针变量时,可能有三种情况:u给指针变量赋值。

      如:给指针变量赋值如:p=&a;u引用指针变量指向的变量引用指针变量指向的变量如如有有p=&a;*p=1;则执行则执行printf(“%d”,*p);将输出将输出1u引用指针变量的值如:引用指针变量的值如:printf(“%o”,p);使使p指向指向a*p相当于相当于a以以八八进制输进制输出出a的地址的地址8.2.3 怎样引用指针变量怎样引用指针变量要熟练掌握两个有关的运算符:要熟练掌握两个有关的运算符:(1)取地址运算符取地址运算符a是变量是变量a的地址的地址(2)*指针运算符(指针运算符(“间接访问间接访问”运算符)运算符)如果如果:p指向变量指向变量a,则则*p就代表就代表ak=*p;(把把a的值的值赋给赋给k)*p=1;(把把1赋给赋给a)例例8.2输入输入a和和b两个整数,按先大后小的两个整数,按先大后小的顺序输出顺序输出a和和b解题思路:用指针方法来处理这个问题解题思路:用指针方法来处理这个问题不交换整型变量的值,而是交换两个指针不交换整型变量的值,而是交换两个指针变量的值变量的值includeintmain()int*p1,*p2,*p,a,b;printf(“integernumbers:);scanf(“%d,%d”,&a,&b);p1=&a;p2=&b;if(ab)p=p1;p1=p2;p2=p;printf(“a=%d,b=%dn”,a,b);printf(“%d,%dn”,*p1,*p2);return0;abp1p2p59&a&b成立成立#includeintmain()int*p1,*p2,*p,a,b;printf(“integernumbers:);scanf(“%d,%d”,&a,&b);p1=&a;p2=&b;if(ab)p=p1;p1=p2;p2=p;printf(“a=%d,b=%dn”,a,b);printf(“%d,%dn”,*p1,*p2);return0;abp1p2p59&a&b&b&a#includeintmain()int*p1,*p2,*p,a,b;printf(“integernumbers:);scanf(“%d,%d”,&a,&b);p1=&a;p2=&b;if(ab)p=p1;p1=p2;p2=p;printf(“a=%d,b=%dn”,a,b);printf(“%d,%dn”,*p1,*p2);return0;abp1p2p59&a&b&b&a#includeintmain()int*p1,*p2,*p,a,b;printf(“integernumbers:);scanf(“%d,%d”,&a,&b);p1=&a;p2=&b;if(ab)p=p1;p1=p2;p2=p;printf(“a=%d,b=%dn”,a,b);printf(“%d,%dn”,*p1,*p2);return0;abp1p2p59&a&b&b&a可否改为可否改为p1=&b; p2=&a;?注意注意:ua和和b的值并未交换,它们仍保持原值的值并未交换,它们仍保持原值u但但p1和和p2的值改变了。

      的值改变了p1的值原为的值原为&a,后,后来变成来变成&b,p2原值为原值为&b,后来变成,后来变成&au这样在输出这样在输出*p1和和*p2时,实际上是输出变时,实际上是输出变量量b和和a的值,所以先输出的值,所以先输出9,然后输出,然后输出58.2.4 指针变量作为函数参数指针变量作为函数参数例例8.3题目要求同例题目要求同例8.2,即对输入的两个,即对输入的两个整数按大小顺序输出现用函数处理,而且整数按大小顺序输出现用函数处理,而且用指针类型的数据作函数参数用指针类型的数据作函数参数解题思路:定义一个函数解题思路:定义一个函数swap,将指向两,将指向两个整型变量的指针变量作为实参传递给个整型变量的指针变量作为实参传递给swap函数的形参指针变量,在函数中通过函数的形参指针变量,在函数中通过指针实现交换两个变量的值指针实现交换两个变量的值includeintmain()voidswap(int*p1,int*p2);inta,b;int*pointer_1,*pointer_2;printf(pleaseenteraandb:);scanf(“%d,%d”,&a,&b);pointer_1=&a;pointer_2=&b;if(ab)swap(pointer_1,pointer_2);printf(“max=%。

      点击阅读更多内容
      关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
      手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
      ©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.