指针、数组和地址之间的关系
在定义数组时,编译器必须分配基地址和足够的存储空间,以存储数组的所有元素。数组的基地址是在内存中存储数组的起始位置,是数组中第一个元素(下标为0)的地址,因此数组名本身是一个地址即指针值。在访问内存方面,指针和数组几乎相同,区别在于:指针是以地址作为值的变量,而数组名的值是一个特殊的固定地址,可以看作常量指针。
假设给出定义int a[100], *p;
,系统将编号为3000,3002,3004,…的内存字节作为数组元素a[0],a[1],a[2],…,a[99]的地址(假定系统int型变量的长度为2个字节),那么其中内存位置3000是数组a的基地址,也是a[0]的地址。
于是p=a;
和p=&a[0];
是等价的,p=a+1;
和p=&a[1];
亦是等价的。
数组和指针之间的关系如下图:
指针 | 内存地址 | 内存单元 | 数组元素 |
---|---|---|---|
p | 3000 | a[0] | |
p+1 | 3002 | a[1] | |
… | … | ||
… | … | ||
p+i | 3000+2i | a[i] | |
… | … | ||
p+99 | 3198 | a[99] |
对数组元素求和
如果已经对数组a进行了赋值,以下语句对数组元素求和:
sum = 0;
for (p = a; p <= a[99]; p++)
sum += *p;
在循环中,指针变量p
的初