1、第八章 指针,_ 虎贲讲师:路谨铭,_,章节知识点:,8.1 地址和指针的概念 8.2 指针变量 8.3 指针与数组 8.4 指针与字符串 8.5 指针的指针 8.6 指针与函数,笔试考点分布,机试考点分布与分析,8.1 地址和指针的概念,8.1.1 内存单元的地址计算机硬件系统的内存储器中,拥有大量的存储单元。一般把存储器中的若干个字节称为一个存储单元。为了方便管理,必须为每一个存储单元编号,这个编号就是存储单元的地址。每个内存单元都有一个惟一的地址,根据一个内存单元的地址即可准确地找到该内存单元。,8.1.2 指针的概念指针其实就是地址。一个变量在内存单元的首地址称为该变量的“指针”,通过
2、变量的指针可以找到该变量所占用的内存单元。,例如:int x,y;,指针变量,就是专门用来存放内存地址的变量。它是一种特殊的变量,它的特殊之处就在于它的变量值是地址(即指针),而一般的变量的值的是普通的数据。8.2.1 指针变量的定义C语言规定所有变量在使用前必须先定义,指针变量也不例外。指针变量的定义形式如下:类型名 *指针变量名;例如: int *p , *q;,8.2 指针变量,float *s; char *t;,8.2.2 指针变量的引用C 语言中对指针变量的引用是通过两个运算符“&”和“*”实现的。(1)&是取地址运算符,它的一般格式是:&变量名。(2)*是取值运算符,也称为间接访
3、问运算符。它的一般格式是:*指针变量名,main( ) int x, y; int *p; x = 10; p = ,8.2.3 指针变量的初始化,指针变量在使用之前必须对其进行初始化,使指针变量指向一个确定的内存单元。一般形式为:类型说明符 *指针变量名初始地址值; 例如: int a = 10; int *p = /* 定义p为一个指针变量,且指向变量a */,1、赋值运算指针变量的赋值运算只能在同一数据类型之间进行,有以下几种形式。 int *p1, *p2, a, s5; int *p1 = /* p1和p2都是指针变量,把p2的值赋给p1 */,8.2.4 指针的运算,2、算术运算指
4、针进行算术运算主要是对指针变量加上或减去一个整数,这样会使指针变量指向相邻的存储单元,这其实就是指针移动。只有指针变量指向一片连续的存储单元时,指针的移动才有意义。 例如:在内存中有一片地址连续的存储单元,基类型为int类型的指针变量p指向地址为1002的存储单元,若执行了操作p = p + 1, 则指针变量p指向了首地址为1006的存储单元, 3、关系运算指针的关系运算其实就是比较地址值的大小。设p、q是指向同一数据集合的指针变量,如果pq的值为真,则表明p指针变量所指向的元素在q指针变量所指向的元素之后;反之则在之前,,章节知识点:,8.1 地址和指针的概念 8.2 指针变量 8.3 指针
5、与数组 8.4 指针与字符串 8.5 指针的指针 8.6 指针与函数,8.3 指针与数组,8.3.2 指针与一维数组,8.3.1 指针与一维数组,8.3.1 指针与一维数组,C语言规定,数组名代表数组的首地址。一维数组中,第一个元素的地址即为该数组的起始地址。,1、建立指针变量与一维数组的联系,例如,要创建一个指向某个int型一维数组a的指针变量pa,可先定义: int a6, *pa; 然后对指针变量赋值: pa=a;或pa=&a0;,2、用指针访问数组元素,通过指针引用数组元素int *p, a5;p = a+1等价于&a1。,3)用带下标的指针变量引用一维数组元素,如有以下定义语句:in
6、t *p, a5;p = a; 我们可以使用p0来表示p指针指向的内存单元,使用p1标示p指针指向的内存单元的下一个内存单元。也就是说可以用p0表示a0,p1表示a1。,因此,对数组元素ai可以有4种等价的引用方法:ai;pi;*(a+i);*(p+i)。 对应的,ai的地址也有4种等价的方式: &ai;πa+i;p+i。,8.3.2 指针与二维数组,1、二维数组的首地址和数组元素的地址,二维数组名同样也是一个存放地址常量的指针,其值为二维数组中第一个元素的地址。一个二维数组分解为多个一维数组来处理。因此数组a可以理解为由多个一维数组组成的特殊数组。例如:,int a23;,二维数组元素
7、的地址可以由表达式&aij求得,也可以通过每行的首地址来表示。在以上二位数组a中,每个元素的地址可以通过每行的首地址a0、a1来表示。如地址&a00可以用a0+0来表示,地址&a01可以用a0+1表示。取数组元素aij的地址通常有以下5种方法: (1)通过直接在数组元素aij前加取址符号&:&aij。 (2)通过第i行的首地址ai加一个数值:ai+j。 (3)通过ai与*(a+i)等价:*(a+i)+j。 (4)通过数组元素a00的地址为参照:&a00+x*i+j(x为每行的元素个数)。 (5)通过&a00与a0等价:a0+x*i+j(x为每行的元素个数)。以上5个表达式均表示aij的地址,所
8、以,只需要在每个表达式前加上*既可得到5种二维数组元素的引用方法。由于ai和*(a+i)相同,所以aij又可以变形为(*(a+i)j。,2、 二维数组元素及地址,3、 指针数组,1) 定义指针数组指针数组一般定义如下:类型名 *指针数组名常量表达式; 如: int *p3;,int *p3,a32,i,j;,p0,p1,p2,a21,a20,a11,a10,a01,a00,指针数组指向二维数组,for(i=0;i3;i+) pi=ai;,2)通过指针数组引用二维数组元素,当p数组的每个元素指向a数组每行的开头时,a数组中的元素aij与*(ai+j)和*(pi+j)是完全等价的。因此,可以通过指
9、针数组p来引用a数组元素,它们的等价形式如下: *(pi+j)与*(ai+j)对应 *(*(p+i)+j)与*(*(a+i)+j)对应 (*(p+i)j与(*(a+i)j对应 pij与aij对应,4、 行指针,1) 定义行指针 行指针的一般定义形式如下: 类型名 (*指针数组名)常量表达式;,如:int (*p)2;,2)通过行指针引用二维数组元素如有以下定义:int a32,(*p)2;p = a; 当p指向a数组的开头时,可以通过以下形式来引用aij:*(pi+j)与*(ai+j)对应*(*(p+i)+j)与*(*(a+i)+j)对应(*(p+i)j与(*(a+i)j对应pij与aij对应
10、,从定义格式上看,指针数组int *p3与行指针int (*p)2极为相似,但二者却又本质区别。int *p3表示一个数组,它含有三个元素p0, p1, p2,且这三个元素只能存放整型元素的地址;int (*p)2表示一个指针变量,它仅有一个存储空间,只能存放一个长度为2的一维数组的指针。,5、指针数组与行指针的区别,章节知识点:,8.1 地址和指针的概念 8.2 指针变量 8.3 指针与数组 8.4 指针与字符串 8.5 指针的指针 8.6 指针与函数,8.4 指针与字符串,在C语言中,可以通过字符指针来处理字符串。 (1)指针与字符串例如:char *p = “China“; 或者char
11、 *p ; p = “China“;,(2)指针与字符数组 char str=“China“, *pstr = “China“;,8.5 指针的指针,指针变量也是变量,也有地址。我们通常把用来保存指针变量地址的变量叫做二级指针,或者叫做指针的指针。二级指针的说明形式如下:类型名 *指针变量名; 例:如有以下定义: #include main( ) int a=10,*pa,*ppa; pa = ,8.6 指针与函数,8.6.1 函数指针变量在语言中,一个函数也是占用一段连续的内存空间,而函数名和数组名一样也表示该函数所占内存区的首地址(或者叫函数的入口),所以函数名也是一个地址常量。那么此时我
12、们也可以把函数的这个首地址赋予一个指针变量,使该指针变量指向该函数。我们把这种指向函数的指针变量称为“函数指针变量”。函数指针变量定义的一般格式:类型说明符 (*指针名)();“类型说明符”表示函数的返回值类型。(* 指针名)表示“*”后面的变量是定义的指针变量。,例如: int (*p)( );,例8.7:本例用来说明用指针形式实现对函数调用的方法。 #include int he(int a,int b) int sum;sum=a+b;return sum; main() int he(int a,int b);int (*p)();int x,y,z;p=he;scanf(“%d%d“
13、, ,我们知道对于函数而言,它的返回值有字符型、整型或者浮点型,这节课我们将介绍函数返回值类型为指针型数据的函数。这种函数的一般格式为:类型说明符 *函数名(参数表列); 类型说明符表示函数的返回指针所指的数据的数据类型。 如:int *p(int x,int y),8.6.2 指针型函数,在C语言中,运用指针是一种复杂但是非常高效的方式,而且指针可以解决复杂问题。学完本章,我们应该学会: 指针变量的定义 (1)int *p p是一个指针,指向一个整型数据。 (2)int *p() p是一个函数,该函数返回值为指针类型。 (3)int (*p)() p是一个指针,指向一个函数。 (4)int *p p是一个数组,该数组元素均为指向整型数据的指针。 (5)int (*p) p是一个行指针,该行指针指向一个二维数组,指针p每移动一次,将跨过一行。 。,本章总结:,2、指针与数组之间的关系。(1)指针与一维数组。(2)指针与二维数组。(3)指针与字符数组。 3、指针与函数之间的关系。(1)函数指针。(2)指针函数,