
第9章指针
1

本章知识点9.1地址和指针9.2指针变量9.3指向数组的指针变量9.4函数指针变量9.5返回指针值的函数9.6指针数组和指向指针的指针9.7小结
本章知识点 9.1 地址和指针 9.2 指针变量 9.3 指向数组的指针变量 9.4 函数指针变量 9.5 返回指针值的函数 9.6 指针数组和指向指针的指针 9.7 小结 2

9.3指向数组的指针变量9.3.1指向数组元素的指针9.3.2通过指针引用数组元素9.3.3指向数组的指针变量作函数参数9.3.4指向多维数组的指针变量
9.3.1 指向数组元素的指针 9.3.2 通过指针引用数组元素 9.3.3 指向数组的指针变量作函数参数 9.3.4 指向多维数组的指针变量

关于数组的术语①数组首地址(起始地址、数组的指针)一是一个地址常量。计算机系统为数组分配的连续多个内存单元中第一个单元的地址----用数组名表示。例1: int a[5];假设数组a的首地址是2000。数组a的首地址②数组元素的地址(数组元素的指针):数组元素(与简单变量一样)的存储单元的首地址2000a[0]例2:a[2]的地址是2008,即&a[2]2004a[1]2008a[2]2012a[3]2016a[4]4
①数组首地址(起始地址、数组的指针)—是一个地址常量。 Ø 计算机系统为数组分配的连续多个内存单元中第一个单元的 地址-用数组名表示。 例1:int a[5]; 关于数组的术语 2000 a[0] 2004 a[1] 2008 a[2] 2012 a[3] 2016 a[4] ②数组元素的地址(数组元素的指针): u 数组元素(与简单变量一样)的存储单元的首地址。 例2:a[2]的地址是2008,即&a[2] 4 数组 a的首地址 // 假设数组a的首地址是2000

9.3.1指向数组元素的指针P189可以用一个指针变量指向一个数组元素例如:int a[10]={1,3,5,7,9,11,13,15,17,19]1)int *p;a[o]1&a[o]P② p=&a[0];35等价于int*p=a;7等价于p=a;或int*p=&a[O];911注意1:数组名a代表数组首元素的地址1315注意2:p=a;I是“把a数组的首元素的17“把数组地址赋给指针变量p”,而不是a[9]19a各元素的值赋给p
可以用一个指针变量指向一个数组元素。 int a[10]={1,3,5,7,9,11,13,15,17,19}; ① int *p; ② p = &a[0]; 等价于p=a; 等价于 int *p=a; 或int *p=&a[0]; 注意1:数组名 a 代表数组首元素的地址。 注意2:p=a; //是“把a数组的首元素的 地址赋给指针变量p” ,而不是“把数组 a各元素的值赋给p” 。 例如:

9.3.2通过指针引用数组元素--P190C语言规定:如果指针变量p已指向数组中的一个元素指向同一数组中的下一个元素。p+1:指向同一数组中的前一个元素。p-1::例1:inta[10],*p=a;ll假设a[0]的地址是2000则:p的值为20001p+1的值为2004越界!!!p-1的值为1996
C语言规定:如果指针变量 p 已指向数组中的一个元素: ① p+1:指向同一数组中的下一个元素。 ② p-1:指向同一数组中的前一个元素。 例1:int a[10] , *p=a;// 假设a[0]的地址是2000 则: ① p的值为2000 ② p+1的值为2004 ③ p-1的值为1996 越界!!!

p.a[0]如果:p=&a[O]:Il相当于p=a;p+1,a+1一a[1](1)*(p+i)或*(a+i)是p+i或a+i所指向a[2]的数组元素--a[]例如:*(p+5)或*(a+5)就是a[5]对ai的求解过程:先按a+i*dp+i,a+i-a[i]计算出数组元素的地址,然*(p+i)后找出此地址所指向的单元C中的值。a[8]a[9]p+9,a+9
如果:p=&a[0]; // 相当于p=a; (1)*(p+i)或*(a+i)是p+i或a+i所指向 的数组元素-a[i]。 例如:*(p+5) 或*(a+5)就是a[5] 对a[i]的求解过程:先按a+i*d 计算出数组元素的地址,然 后找出此地址所指向的单元 中的值。 *(p+i)

p.a[0]如果:p=&a[0];l p=a;p+1,a+1a[1](2)指向数组元素的指针变量p也a[2]可以带下标。如:p[小、*(p+i)、*(a+i)等价于a[]p+i,a+i-a[i]*(p+i)?a[8]例1:int a[10]={2,4,6,8,10];a[9]p+9,a+9int *p=a;printf("%d %d %d %d\n" ,p[2],*(p+2),a[2],*(a+2))666//p[2]、*(p+2)、*(a+2 等价于a[2]
例1:int a[10]={2,4,6,8,10}; int *p=a; printf("%d %d %d %d\n" ,p[2], *(p+2),a[2], *(a+2)); //p[2]、 *(p+2)、 *(a+2) 等价于a[2] (2)指向数组元素的指针变量p也 可以带下标。 如:p[i]、 *(p+i)、 *(a+i) 等价于 a[i] *(p+i) 如果:p=&a[0]; // p=a;

a[0](3)如果指针p1和p2都指a[1]向同一数组的不同元素。a[2]则:p2-p1的值是4p1→a[3]a[4]Ⅱ表示两者之间元素个数a[5]注意:不能p1+p2a[6]p2a[7]a[8]a[9]
(3) 如果指针p1和p2都指 向同一数组的不同元素。 则:p2-p1的值是4 //表示两者之间元素个数 注意:不能p1+p2 a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8] a[9] p1p2

小结:引用一维数组元素有2种方法若: int a[10],*p =a ;引用一个数组元素,可用下面2种方法(1)下标法,如a[]形式(2)指针法,如*(a+i)、*(p+i)、p[i
若:int a[10] , *p = a ; //引用一个数组元素,可用下面2种方法: (1) 下标法,如a[i]形式 (2) 指针法,如*(a+i)、 *(p+i)、p[i]