你这个程序定义了一个指针 p,它指向数组a。p 是指针,而不是数组名。int *p, 变量名叫 p,类型为 int *,可存放一个 int 数据的地址。*p = a,意思是将数组 a 的首地址赋给指针 p ,而不是像你说的,将数组名给了 p 。
数组和指针不等价,数组是另外一种类型。数组和指针不等价的一个典型案例就是求数组的长度,这个时候只能使用数组名,不能使用数组指针:
#include <stdio.h>
int main()
{
int a[6] = { 0, 1, 2, 3, 4, 5 };
int *p = a;
int len_a = sizeof(a) / sizeof(int);
int len_p = sizeof(p) / sizeof(int);
printf("len_a = %d, len_p = %d\n",len_a,len_p);
return 0;
}
//运行结果:len_a = 6, len_p = 1
数组是一系列数据的集合,没有开始和结束标志,p 仅仅是一个指向 int 类型的指针,编译器不知道它指向的是一个整数还是一堆整数,对 p 使用 sizeof 求得的是指针变量本身的长度。也就是说,编译器并没有把 p 和数组关联起来,p 仅仅是一个指针变量,不管它指向哪里,sizeof 求得的永远是它本身所占用的字节数。那么,数组在什么时候会转换为指针呢?
(1) 用 a[i] 这样的形式对数组进行访问总是会被编译器改写成(或者说解释为)像 *(a+i) 这样的指针形式。
(2) 指针始终是指针,它绝不可以改写成数组。你可以用下标形式访问指针,一般都是指针作为函数参数时,而且你知道实际传递给函数的是一个数组。
(3) 在特定的环境中,当数组作为函数形参时,也只有这种情况,一个数组可以看做是一个指针。作为函数形参的数组始终会被编译器修改成指向数组第一个元素的指针。
(4) 当希望向函数传递数组时,可以把函数参数定义为数组形式(可以指定长度也可以不指定长度),也可以定义为指针。不管哪种形式,在函数内部都要作为指针变量对待。