《C语言程序设计 第2版 教学课件 ppt 作者 李敏第6章 指针》由会员分享,可在线阅读,更多相关《C语言程序设计 第2版 教学课件 ppt 作者 李敏第6章 指针(51页珍藏版)》请在金锄头文库上搜索。
1、1,第6章 指针,C 语言程序设计,2019/7/10,2,6.1 指针的概念 6.2 指针变量的定义和引用 6.3 指针与数组 6.4 指针与字符串 6.5 指针与函数 6.6 指针数组,本章主要内容,2019/7/10,3,6.1 指针的概念,计算机的内存储器是由连续的存储单元组成的,每一个存储单元都对应着一个唯一的编号,这个编号就是地址。 当在程序中定义一个变量时,C编译程序就会为其在内存中分配带有编号的存储单元,以便存放这个变量的取值。变量的类型不同,分配给它的内存空间大小也不同,比如,分给字符变量一个字节,分给整型变量两个字节,分给实型变量四个字节等。,2019/7/10,4,6.1
2、 指针的概念,【例6-1】输出指定变量的地址。 #include void main() int a=10; float b=123.45; char c=A; printf(“address of a=%un“, ,程序运行结果: address of a=4058 address of b=4060 address of c=4065,2019/7/10,5,6.1 指针的概念,变量a、b、c在内存中分配的存储单元情况如图6-1所示。 一个地址起到指向某个存储单元的作用,因此,形象地称一个变量的内存地址是它的“指针”,即地址就是指针,指针就是地址。,图6-1,2019/7/10,6,6.1
3、 指针的概念,把一个变量的内存地址(即指针)存放在另一个变量里,那么这个专门用来存放变量地址的变量就是“指针变量”。 在程序中一般是通过变量名或地址来对内存单元进行存取操作。根据存取变量值的不同方式,分为直接访问和间接访问。 按变量地址存取变量值的方式称为“直接访问”方式。 由指针变量的值得到另一变量的地址,再通过得到的这个地址,完成对存储单元的访问。 这种访问为“间接访问”。,返回,2019/7/10,7,6.2 指针变量的定义和引用,6.2.1 指针变量的定义 6.2.2 指针变量的引用 6.2.3 指针变量应用举例,返回,2019/7/10,8,6.2.1 指针变量的定义,定义指针变量的
4、一般形式为: “类型标识符”是指针变量所指向的变量的类型,“*”表示所定义的变量类型为指针型。例如: int *p; float *q; char *ch;,类型标识符 *指针变量名,2019/7/10,9,6.2.1 指针变量的定义,定义指针变量后,就可以写入指向某种数据类型的变量的地址,或者说是为指针变量赋初值,下面通过例子说明。例如: int a=60,*p; float b=17.9,*q; char ch=A,*r; p=,2019/7/10,10,6.2.1 指针变量的定义,用图6-3描述如下: 强调说明: 1)定义指针变量时,必须指定指针变量所要指向的变量的类型。 2)一个指针变
5、量只能指向同一类型的变量,例如,有定义“float *p;”,则指针变量p只能指向实型变量,不允许指向实型之外的其它类型的变量。 3)当定义指针变量时,指针变量的值是随机的,不能确定它具体的指向,必须为其赋值才有意义。,2019/7/10,11,6.2.2 指针变量的引用,在指针变量的使用中,有两个与其密切相关的运算符: 1),&变量名,2019/7/10,12,6.2.2 指针变量的引用,不允许把一个数值赋给指针变量,下面的赋值是错误的: int *p; p=16; 2)*(指针运算符,也称间接访问运算符) 在指针变量的前面添加指针运算符,表示指针变量所指向的变量,运算结果获取指针变量所指向
6、变量的值。其一般形式: 例如: int a=17,*p; p=,*指针变量名,2019/7/10,13,6.2.2 指针变量的引用,指针变量p指向整型变量a,则*p等价于变量a,即*p的值也为17,可以直观地认为变量a与*p是对应着同一个存储单元。可见,可以通过指针变量p间接访问变量a。,说明:指针运算符“*”和声明指针类型名中的“*”不是一回事,在指针变量声明中,“*”是类型名,表示其后的变量是指针类型;而表达式中出现的“*”则是一个指针运算符,用来表示指针变量所指向的变量。,2019/7/10,14,6.2.2 指针变量的引用,下面对运算符“则&*p、&a、p是等价的,反之,*&a、*p、
7、a也是等价的,均表示变量a。“&”和“*”两个运算符的优先级别相同,但按自右而左方向结合。 (*p)+相当于a+,如果去掉括号变为*p+,因“+”与“*”优先级别相同,但按自右而左方向结合, *p+相当于*(p+),因+在p右侧,先对p的原值进行*运算,得到a的值,然后使指针变量p的值加1,因p的值发生了改变,此时p不再指向变量a。,2019/7/10,15,6.2.2 指针变量的引用,【例6-2】用指针变量输出所指向的变量的值。 #include void main() int a,*p; float b,*q; scanf(“%d%f“,程序运行情况如下: 171.23 17,1.2300
8、00 17,1.230000,2019/7/10,16,6.2.2 指针变量的引用,如果将上述程序改为: main() int a,*p; float b,*q; p= ,程序运行情况如下: 171.23 17,1.230000 17,1.230000,2019/7/10,17,6.2.3 指针变量应用举例,【例6-3】使用指针变量,将变量a和b的值交换,要求输出交换前后的结果。请见教材 【例6-4】输入三个数,输出其中的最大数。 请见教材,2019/7/10,18,6.3 指针与数组,6.3.1 指向一维数组的指针变量 6.3.2 指向二维数组的指针变量 6.3.3 指针与数组应用举例,返回
9、,2019/7/10,19,6.3.1 指向一维数组的指针变量,将一维数组的名字或某一数组元素的地址赋给指针变量,指针变量即指向该一维数组或数组元素。例如: int a7, *p; p=a; 定义一维数组a和指针变量p,通过p=a;使p指向数组a的首地址,这时的*p就是a0的值。如图6-6所示。,图6-6,2019/7/10,20,6.3.1 指向一维数组的指针变量,如果将数组元素a2的地址赋给变量p,即p=则指针变量p指向数组元素a2,这时的*p就是a2的值,如图6-7所示。,图6-7,2019/7/10,21,6.3.1 指向一维数组的指针变量,如果指针变量p已指向数组中的一个元素,则p+
10、1指向同一数组中的下一个元素。这里的p+1不是简单的将p值加1,而是p+1d,其中d是一个数组元素所占的字节数。如果p的初值是&a0,则p+3和a+3均表示a3的地址,如图6-8所示。,图6-8,2019/7/10,22,6.3.1 指向一维数组的指针变量,引入指针变量后,可以 用两种方法来访问数组元 素,下面通过例子说明。 【例6-5】分别用下标法和指 针法访问数组元素。 #include void main() int a7=1,2,3,4,5,6,7; int i,*p; for(i=0;i=6;i+),printf(“%d“,ai); printf(“n“); for(p=a;p=a+
11、6;p+) printf(“%d“,*p); ,程序运行结果: 1234567 1234567,2019/7/10,23,6.3.1 指向一维数组的指针变量,也可以用数组名计算数组元素的地址,或用带下标的指针变量来引用数组元素。将上面的程序改写如下: #include void main() int a7=1,2,3,4,5,6,7; int i,*p;,p=a; for(i=0;i=6;i+) printf(“%d“,*(a+i); printf(“n“); for(i=0;i=6;i+) printf(“%d“,pi); ,2019/7/10,24,6.3.2 指向多维数组的指针变量,指针
12、变量也可以指向多维数组,本节以二维数组为例介绍指向多维数组的指针变量。定义如下二维数组: int a23=1,2,3,4,5,6; 语言二维数组a分解为多个一维数组来处理。上面的数组a包含2行,可分解为二个一维数组,即a0和a1,每一个一维数组又含有三个元素。则各数组元素的地址及其值如图6-9所示。,2019/7/10,25,6.3.2 指向多维数组的指针变量,图6-9,2019/7/10,26,6.3.2 指向多维数组的指针变量,a0可以看成是a0+0,指向0行0列元素的首地址;a0+1是0行1列元素a01的首地址,a0+2则是0行2列元素a02的首地址,如图6-10所示。由此可得出ai+j
13、则是一维数组ai的第j列元素首地址,它等于&aij。,图6-10,2019/7/10,27,6.3.2 指向多维数组的指针变量,指向二维数组的行指针变量说明形式: “类型说明符”为所指数组的数据类型,“*”表示其后的变量是指针类型,“数组长度”表示二维数组分解为多个一维数组时,一维数组的长度,也就是二维数组的列数。例如: int a23; int (*p)3; p=a;,类型说明符 (*指针变量名)数组长度,2019/7/10,28,6.3.2 指向多维数组的指针变量,【例6-6】使用指针变量输出二维数组各元素的值。 #include void main() int a23=1,2,3,4,5
14、,6; int (*p)3; int i,j; p=a; for(i=0;i2;i+) for(j=0;j3;j+) printf(“%3d“,*(*(p+i)+j); printf(“n“); ,程序运行结果: 123 456,2019/7/10,29,6.3.2 指向多维数组的指针变量,如果将程序修改如下,程序的运行结果是一样的。 #include void main() int a23=1,2,3,4,5,6; int *p; int i,j; p=a; for(i=0;i2;i+) p=ai; for(j=0;j3;j+), printf(“%3d“,*p); p+; printf(“
15、n“); ,2019/7/10,30,6.3.3指针与数组应用举例,【例6-7】利用指向数组的指针,计算长度为10的一维数组中所有元素之和。 请见教材 【例6-8】运用指针变量,用选择法对10个整数按由小到大的顺序排序。 请见教材 【例6-9】运用指向二维数组的行指针变量,计算4名同学3门功课的总平均分。请见教材,2019/7/10,31,6.4 指针与字符串,在C语言中,也可以用字符指针指向一个字符串,然后通过指针变量对字符串进行访问。例如: char str=“hello“,*p; p=str; 也可以定义为: char *str=“hello“; 虽然没有定义存放字符串常量的字符数组,但系统在内存中还是将该字符串作为字符数组来处理的,即开辟一片连续的存储空间存放字符串。如图6-11所示。,2019/7/10,32,6.4 指针与字符串,图6-11,2019/7/10,33,6.4 指针与字符串,下面的程序用于输出字符串“hello“。 main() char *str=“hello“; printf(“%sn“,str); 如果将输出语句改为: printf(“%sn“,str+3);,输出结果为: lo 如果将输出语句改为: printf(“%cn“,*str); 输出结果为: h,程序运行结果: he