C语言指针讲解.ppt
《C语言指针讲解.ppt》由会员分享,可在线阅读,更多相关《C语言指针讲解.ppt(102页珍藏版)》请在三一办公上搜索。
1、第十章,使用指针,主要内容,10.1 地址和指针的概念 10.2 变量的指针和指向变量的指针变量 10.3 通过指针引用数组 10.4 通过指针字符串 10.5 指向函数的指针 10.6 返回指针值的函数 10.7 指针数组和多重指针 10.8 动态内存分配与指向它的指针变量,10.1地址和指针的概念,内存区的每一个字节有一个编号,这就是“地址”。如果在程序中定义了一个变量,在对程序进行编译时,系统就会给这个变量分配内存单元。,、按变量地址存取变量值的方式称为“直接访问”方式(,);(,);,2.另一种存取变量值的方式称为“间接访问”的方式。即,将变量的地址存放在另一个变量中。,在语言中,指针
2、是一种特殊的变量,它是存放地址的。,一个变量的地址称为该变量的“指针”。例如,地址2000是变量的指针。如果有一个变量专门用来存放另一变量的地址(即指针),则它称为“指针变量”。上述的i_pointer就是一个指针变量。,指针和指针变量的定义:,10.2 变量的指针和指向变量的指针变量,10.1 怎样定义指针变量,定义指针变量的一般形式为基类型*指针变量名;,下面都是合法的定义:float*pointer_;char*pointer_;可以用赋值语句使一个指针变量得到另一个变量的地址,从而使它指向一个该变量。例如:pointer_;pointer_;,在定义指针变量时要注意两点:,在对指针变量
3、赋值时需要注意两点:,指针变量中只能存放地址(指针),不要将一个整数赋给一个指针变量。例:*pointer_1;/*pointer_1是指针变量,是整数,不合法*/(2)赋给指针变量的变是量地址不能是任意的类型,而只能是与指针变量的基类型具有相同类型的变量的地址。,在引用指针变量时,可能有三种情况:给指针变量赋值。如:p=引用指针变量指向的变量。有关的两个运算符:取地址运算符。&a是变量a的地址。*指针运算符(或称“间接访问”运算符),*p是指针变量p指向的对象的值。,10.2.2 怎样引用指针变量,例10.通过指针变量访问整型变量,#include voidmain()int,;int*po
4、inter_,*pointer_;pointer_;/*把变量的地址赋给 pointer_1*/pointer_;/*把变量的地址赋给 pointer_*/printf(%,%,);printf(%,%,*pointer_,*pointer_);,例10.2 输入和两个整数,按先大后小的顺序输出 和。,#include void main()int*1,*2,*,;scanf(,);1;if();printf(=,=,);printf(max=,min=,*1,*2);,运行情况如下:,当输入,时,由于,将和交换。交换前的情况见图(),交换后见图()。,10.3 指针变量作为函数参数,例10.
5、3 对输入的两个整数按大小顺序输出,#include void main()void swap(int*,int*);int,;int*pointer_,*pointer_;scanf(,);pointer_;pointer_2;if(swap(pointer_,pointer_2);printf(,);,void swap(int*,int*)int temp;temp*1;*;*temp;,例10.输入3个整数,,要求按大小顺序将它们输出。用函数实现改变这3个变量的值。,#include void main()void exchange(int*1,int*2,int*3);int,*,*
6、,*;scanf(%,%,%,&,&,&);exchange(,);printf(,);,void exchange(int*,int*,int*)void swap(int*,int*);if(*)swap(,);if(*)swap(,);if(*swap(,);void swap(int*,int*)int temp;temp*;*;*temp;,10.3 通过指针引用数组,一个变量有地址,一个数组包含若干元素,每个数组元素都在内存中占用存储单元,它们都有相应的地址。指针变量既然可以指向变量,当然也可以指向数组元素(把某一元素的地址放到一个指针变量中)。所谓数组元素的指针就是数组元素的地址
7、。,10.3.1 数组元素的指针,可以用一个指针变量指向一个数组元素。例如:;(定义为包含个整型数据的数组)*;(定义为指向整型变量的指针变量);(把元素的地址赋给指针变量)也就是使指向数组的第号元素。,语言规定在指针指向数组元素时,可以对指针进行以下运算:加一个整数(用+或+=),如p+1 减一个整数(用-或-=),如p-1 自加运算,如p+,+p 自减运算,如p-,-p 两个指针相减,如p1-p2(只有p1和p2都指向同一数组中的元素时才有意义)。,指针的运算,分别说明如下:如果指针变量p已指向数组中的一个元素,则指向同一数组中的下一个元素,-指向同一数组中的上一个元素。(2)如果p原来指
8、向a0,执行+p后p的值改变了,在p的原值基础上加d,这样p就指向数组的下一个元素a1。(3)如果的初值为,则和就是数组元素的地址,或者说,它们指向数组的第个元素。*()或*()是或所指向的数组元素,即。(5)如果指针变量p1和p2都指向同一数组,如执行p2-p1,结果是两个地址之差除以数组元素的长度。,10.3 通过指针引用数组元素,引用一个数组元素,可以用:()下标法,如形式;()指针法,如*()或*()。其中是数组名,是指向数组元素的指针变量,其初值。,例10.5 输出数组中的全部元素,假设有一个数组,整型,有个元素。要输出各元素的值有三种方法:,(1)下标法#include void
9、main()int;int;for(;)scanf(,);printf();for(;)printf(,);,(2)通过数组名计算数组元素地址,找出元素的值。#include voidmain()int;int;for(;)scanf(,);printf();for(;)printf(,*();,(3)用指针变量指向数组元素。#include void main()int;int*,;for(;)scanf(,);printf();for(;();)printf(,*);,例10.通过指针变量输出数组的个元素。,#include void main()int*,;for(;)scanf(,);
10、printf();for(;,)printf(,*);,程序运行情况:1 2 3 4 5 6 7 10 9 022153 234 0 0 30036 25202 11631 10259 10237 2104103显然输出的数值并不是数组中各元素的值,#include void main()int*,;for(;)scanf(,);printg();p=a;for(;,)printf(,*);,程序运行情况:1 2 3 4 5 6 7 10 9 01 2 3 4 5 6 7 10 9 0,10.3.4 用数组名作函数参数,在第7章中介绍过可以用数组名作函数的参数。如:void main()i(i
11、nt arr,int);int array;(array,);void(int arr,int),例10 将数组中个整数按相反顺序存放,#include void main()void inv(int,int);int,;printf(The original array:);for(;)printf(,);printf();inv(,);printf(The array has been in verted:);for(;)printf(,);printf();,void inv(int,int)/*形参x是数组名*/int temp,();for(;);temp;temp;return;,
12、运行情况如下:The original array:,The array has been inverted:,,#include void main()void inv(int*,int);int,;printf(The original array:);for(;)printf(,);printf();inv(,);printf(The array has been in verted:);for(;)printf(,);printf();,对刚才的程序可以作一些改动。将函数inv中的形参改成指针变量。,void inv(int*,int)/*形参x为指针变量*/int,temp,*,*,
13、();for(;,)emp*;*;*temp;return;,如果有一个实参数组,想在函数中改变此数组中的元素的值,实参与形参的对应关系有以下种情况:,(1)形参和实参都用数组名,如:void main()void(int,int)int;(,);,(2)实参用数组名,形参用指针变量。如:void()void(int*,int)int;(,);,(3)实参形参都用指针变量。例如:void main()void(int*,int)int,*p=a;(p,);,(4)实参为指针变量,形参为数组名。如:void main()void(int x,int),*p=a;(p,);,#include vo
14、id main()void inv(int*,int);int,*;printf(The original array:n);for(;,)scanf(,);printf();inv(,);/*实参为指针变量*/printf(The array has been inverted:);for(;)printf(,*);printf();,例108 用实参指针变量改写例10.。,void inv(int*,int)int,temp,*,*;();for(;,)emp*;*;*temp;return;,例109 用选择法对个整数按由大到小顺序排序,#include void main()void
15、sort(int,int);int*,10;for(;)scanf(,);sort(,);for(,;)(,*);,void sort(int,int)int,;for(;);for(;)();(!);,10.3.5 通过指针引用多维数组,用指针变量可以指向一维数组中的元素,也可以指向多维数组中的元素。但在概念上和使用上,多维数组的指针比一维数组的指针要复杂一些。,1.多维数组元素的地址,先回顾一下多维数组的性质,可以认为二维数组是“数组的数组”,例:定义int a34=1,3,5,7,;则二维数组a是由3个一维数组所组成的。设二维数组的首行的首地址为,则,2.指向多维数组元素的指针变量,(1
16、)指向数组元素的指针变量,例10.10 用指向元素的指针变量输出二维数组元素的值,#include void main()int 341,3,5,7,9,11,13,15,17,19,21,23;int*;for(;)()printf();printf(,*);,运行结果如下:1 3 5 7 9 11 13 1519 21 23,(2)用指向由个元素组成的一维数组的指针变量,例10.11 输出二维数组任一行任一列元素的值,#include void main()int 1,3,5,7,9,11,13,15,;int(*),;scanf(,);printf(,*(*();,运行情况如下:,(本行
17、为键盘输入),,3.用指向数组的指针作函数参数,例10.12 有一个班,个学生,各学门课,计算总平均分数以及第个学生的成绩。这个题目是很简单的。只是为了说明用指向数组的指针作函数参数而举的例子。用函数average求总平均成绩,用函数search找出并输出第个学生的成绩。,#include void main()void average(float*p,int n);void search(float(*p)4,int n);float score34=65,67,70,60,100,107,90,101,90,99,100,910;average(*score,12);*求12个分数的平均分
18、*search(score,);*求序号为的学生的成绩*,void average(float*,int)float*_;float sum,aver;p_end;for(;_;)sumsum(*);aversum;printf(average,aver);,void search(float(*)4,int)/*p是指向具有4个元素的一维数组的指针*/int;printf(the score of No.%are:,);for(;)printf(5.2,*(*();,程序运行结果如下:average10The score of No.2 are:.10.,例10.3 在上题基础上,查找有一门
19、以上课程不及格的学生,打印出他们的全部课程的成绩。,#include void main()void search(float(*p)4,int n);/*函数声明*/float score34=65,57,70,60,510,107,90,101,90,99,100,910;search(score,);,void search(float(*p)4,int)int,;for(;)flag;for(;)if(*(*())flag;if()printf(No.%d fails,his scores are:n,j+1);for(;)printf(%.,*(*();printf();,程序运行结
20、果如下:No.1 fails,his scores are:.No.2 fails,his scores are:10.10.10.,10.通过指针引用字符串,10.4.字符串的表示形式,例 10.14 定义一个字符数组,对它初始化,然后输出该字符串,#include void main()char stringI love China!;printf(,string);,(1)用字符数组存放一个字符串,然后输出该字符串。,(2)用字符指针指向一个字符串可以不定义字符数组,而定义一个字符指针。用字符指针指向字符串中的字符。,例10.15 定义字符指针,使它指向一个字符串。#include vo
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 指针 讲解

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