简述 一个变量有地址,一个数组包含若干元素,每个数组元 素都在内存中占用存储单元,它们都有相应的地址。指 针变量既然可以指向变量,当然也可以指向数组和数组 元素(把数组起始地址或某一元素的地址放到一个指针变 量中)。 所谓数组的指针是指数组的起始地址,组元素的指针是 数组元素的地址。 引用数组元素可以用下标法(如a3),也可以用指针法, 即通过指向数组元素的指针找到所需的元素。使用指针 法能使目标程序质量高(占内存少,运行速度快)
简述 一个变量有地址,一个数组包含若干元素,每个数组元 素都在内存中占用存储单元,它们都有相应的地址。指 针变量既然可以指向变量,当然也可以指向数组和数组 元素(把数组起始地址或某一元素的地址放到一个指针变 量中)。 所谓数组的指针是指数组的起始地址,组元素的指针是 数组元素的地址。 引用数组元素可以用下标法(如a[3]),也可以用指针法, 即通过指向数组元素的指针找到所需的元素。使用指针 法能使目标程序质量高(占内存少,运行速度快)
指向数组元素的指针(1/2) 定义二个指向数组元素的指 针变量的方法,与以前个绍 的指同变量的指针变量相同 p &.a[0] a[o] 例如: 3 int a10]; 5 int *p; 7 p a0]; 9 11 如图右图所示: 13 15 应当注意,如果数组为nt型 17 则指针变量亦应指向int型。 19 a[9]
指向数组元素的指针(1/2) 定义一个指向数组元素的指 针变量的方法,与以前介绍 的指向变量的指针变量相同。 例如: int a[10]; int *p; p = a[0]; 如图右图所示: 应当注意,如果数组为int型, 则指针变量亦应指向int型
指向数组元素的指针(2/2) 由于C语言规定数组名代表数组的首地址,也就 是第0号元素的地址。因此,下面两个语句等价: p=&a0]: p=a; 注意数组a不代表整个数组,上述“p=a,”的作用 是“把a数组的首地址赋给指针变量p”,而不是 “把数组a各元素的值赋给p”。 在定义指针变量时,可以对它赋予初值: int *p a;
指向数组元素的指针(2/2) 由于C语言规定数组名代表数组的首地址,也就 是第0号元素的地址。因此,下面两个语句等价: p=&a[0]; p=a; 注意数组a不代表整个数组,上述“ p=a; ”的作用 是“把a数组的首地址赋给指针变量p ”,而不是 “把数组a各元素的值赋给p ” 。 在定义指针变量时,可以对它赋予初值: int *p = a;
通过指针引用数组元素(1/3) C的规定:如果指针变量p已指 向数组中的一个元素,则p+1 p a数组 指向同一数组中的下一个元素 p+1,a+1 a[0] (而不是将p值简单地加1)。 a[1] 如果有如下定义: a[2] int a10]; p+i,a+i int p=a; *(p+i) 则: 1)p+i和a+i就是a回的地址 或者说,它们指向a数组的第: p+9,a+9 个元素。如右图所示: a[9]
通过指针引用数组元素(1/3) C的规定:如果指针变量p已指 向数组中的一个元素,则p+1 指向同一数组中的下一个元素 (而不是将p值简单地加1)。 如果有如下定义: int a[10]; int p = a; 则: 1) p+i和a+i就是a[i]的地址, 或者说,它们指向a数组的第i 个元素。如右图所示:
通过指针引用数组元素(2/3) 2) *(p+)或*(a+)是pt或a+所指向的数组元素,即a的。 例如,*p+5)或a+5)就是a5]。 实际上,在编译时,对数组元素a就是处理成*(a+), 即按数组首地址加上相对位移量得到要找的元素的地址, 然后我西该单元中的内容。例如,若数组a的首地址为 1000,设数组为整型,则a3的地址是这样计算出来的: 1000+3×2=1006 然后从1006地址所标志的整型单元取出元素的值,即a[3 的值。 可以看出,.实际上是变址运算符,即将a按a+i计算地 址,然后找出此地址单元中的值
通过指针引用数组元素(2/3) 2) *(p+i)或*(a+i)是p+i或a+i所指向的数组元素,即a[i]。 例如,*(p+5)或(a+5)就是a[5]。 实际上,在编译时,对数组元素a[i]就是处理成*(a+i), 即按数组首地址加上相对位移量得到要找的元素的地址, 然后找出该单元中的内容。例如,若数组a的首地址为 1000,设数组为整型,则a[3]的地址是这样计算出来的: 1000+3×2=1006 然后从1006地址所标志的整型单元取出元素的值,即a[3] 的值。 可以看出,[ ]实际上是变址运算符,即将a[i]按a+i计算地 址,然后找出此地址单元中的值