在C语言中,指针与数组有着密切的关系,这种关系表现在对数组元素的引用可以改写成对指针的间接引用。有数组a,则a[i]与*(a+i)等价;有指针变量p,则*(p+i)与p[i]等价。 ① (下标法) a[i] <=> *(a+i) (地址法) a[0] <=> *a a[1] <=> *(a+1) a[2] <=> *(a+2) …… C语言规定:数组名a表示此数组的首地址。 也即:a <=> &a[0] 同理: a+0 <=> &a[0] a+1 <=> &a[1] a+i <=> &a[i] 数组变量a没有专属于自己的存储单元,并不是一个真正的变量。数组变量a的右值并非在某个存储单元中存储,而是人为规定的, 数组变量a有存储单元但并不真正属于自己,数组变量a的右值只是规定的,数组变量只能算作虚拟的变量。 引用一个数组元素,既可以利用前面介绍的下标法(通过数组名和下标来实现),也可以利用地址法(通过给出的地址来访问)。 ② *(p+i) <=> p[i] 如果一个整型指针变量pi的右值为0x0012 ff00,则pi + 1的值是多少呢? 做加法运算时变量pi应表现为右值0x0012 ff00, pi + 1的结果也为指针变量且指向后面相邻的整型存储单元, 因此新的指针变量pi+1的右值为0x0012 ff04. 数据名实质上是一个指针常量(即一个具体的地址值)。 ⊙前提:..当一个指针变量p指向一个数组a[]时. 其实就是把数组名a这个指针常量赋给了指针变量p,此时p与a是等价的,p[i]即a[i]。 而指针变量的+1操作,并不是真的其值就比原值多1,而是按其指向的数据类型来决定增加多少。因此当指向数组a的指针p每+1便指向数组中的下一个元素,+i当然就指向数组中第i个元素. 即*(p+i) <=> a[i] <=> p[i] —— 不知者白沫 |
|