int main()
{
int a[5] = {555,444,333,222,111};
int *p;
p = &a; //数组a的首地址
p = &a[0]; //数组a首元素的地址
p = a; //数组a首元素的首地址
a = p; //编译就会报错,因为数组名是个常量,所以不能赋值,所以数组名不能做左值。
printf("*p = %d ", *p); //结果都是 *p = 555
p +=1; //指针+1;表示指向下一格
printf("*p = %d ", *p);//结果就是444
}
注:
1、数组名:做右值时,数组名表示数组的首元素首地址,因此可以直接赋值给指针。
int a[5]; //而a和&a[0]都表示数组首元素a[0]的首地址;而&a则表示数组的首地址。
2、数组首元素的首地址和数组的首地址是不同的。前者时数组元素的地址,而后者是数组整体的地址。两者的含义不同,但是数值上是相同的。
根据上边,我们知道可以用一个指针指向数组的第一个元素,这样就可以用间接访问的方式去逐个访问数组中各个元素,这样访问数组就有了两种方式。
int a[5]; int *p; p = a;
以数组的方式逐个访问: a[0] a[1] a[2] a[3] a[4]
指针的方式逐个访问: *p *(p + 1 ) *(p + 2 ) *(p + 3 ) *(p + 4 )
注:
指针本身也是一种变量,因此也可以进行运算。但是因为指针变量本身存的是某个其他变量的地址值,因此该值进行 * / %等运算是没有意义的。指针变量+1代表指针所指向的格子向后挪一格,-1代表指针所指向的格子向前挪一格。