9.指针与数组的关系
1. 数组与指针的基本关系:变量存放在内存中,有地址编号,我们定义的数组,其实就是多个相同类型的变量的集合,每个变量都占内存空间,都有地址编号。
所以指针当然也可以存放数组元素的地址。
2. 数组元素的引用方法
方法1: 数组名[ 下标 ]
int a[ 10 ];
a [2] = 100;
方法2: 指针名加下标
int a [10];
int *p;
p = a;
p[ 2 ] =23; //因为p和a等价,p[9] = 23;等价于 a[9] = 23;
补充说明:C语言规定,数组的名字就是数组的首地址,即第0个元素 a[0] 的 地址,是个常量。
注意: p 和 a ,不同p是指针变量,a是个常量,所以可以用等号给p赋值,但是不可以给 a 赋值。
int* p;
int a[10] = {1,2,3,4,5,6,7};
p = a; //p与a等价p[9] = 23;等价于 a[9] = 23;
for (int i = 0; i < 10; i++)
{
printf("i=%d,*p = %d,p = %p\n", i,*p, p);
p++;
}
方法3 :通过指针运算加取值的方法来引用数组的元素。
int a[ 10 ];
int *p;
p = a;
*(p + 2)= 100; // 相当于 a[2] = 100;
//解释: p 是第0个元素的地址, p + 2是a [ 2 ] =这个元素的地址、对第二个元素的地址取值,即 a [2].
**注意: *(a + n) < = = > *(p + n) < = = > a[n] < == > p[n]**四者等价
nt* p;
int a[10] = {1,2,3,4,5,6,7};
p = a; //p与a等价p[9] = 23;等价于 a[9] = 23;
printf("*(p + 2) = %d\n", *(p + 2));
printf("*(a + 2) = %d\n", *(a + 2));
printf("(p + 2) = %p\n", (p + 2)); //p+2 等价于 a[2]
printf("(a + 2) = %p\n", &a[2]);