关于指向数组的指针有关问题

关于指向数组的指针问题

int (*p)[5]; //定义一个指向有5个元素的数组
int  a[5] = {1, 2, 3, 4, 5};
p = &a; //&a是什么意思?为啥用a不可以呢?a不是代表数组的首地址吗?


p = a不行,但是p=&a就可以,
不明白为什么
我是在vc6下编译的
------解决方案--------------------
p相当于int**,a相当于int*,&a相当于int**
------解决方案--------------------
p = a不行,但是p=&a就可以,

a的类型是 int [5],可以隐式转换为int*, 但不能隐式转换为 int (*)[5]
&a的类型是int(*)[5],刚好匹配,无需转换。 
------解决方案--------------------
a是指向整数的指针,也就是数组中的第一个元素。
&a返回的才是指向数组指针的指针。
------解决方案--------------------
int (*p)[5];//p实际上是一个指向二维数组的指针

------解决方案--------------------
1楼和2楼说的都很明白。
------解决方案--------------------
[code=c]#include<stdio.h>
int a[3]={1,3,5};
int *p1= NULL;
int (*p2)[3]=NULL;
int main()
{
printf("首个元素地址%p\n",a);
printf("第二个元素地址%p\n",a+1);
printf("正真的数组地址%p\n",&a);
printf("正真的数组地址%p\n",(&a)[0]);
printf("数组地址+1后是%p\n",(&a)[1]);
printf("sizeof (a) = %d\n",sizeof (a));
printf("sizeof (&a) = %d\n",sizeof (&a));
printf("sizeof (a + 1) = %d\n",sizeof (a + 1));
printf("---------------------------------\n");
printf("为什么是 %d\n",*(a+1));
printf("为什么是 %d\n",*(*(&a+1) - 1));
printf("为什么是 %d\n",*a);
printf("---------------------------------\n");

p1 =a;
p2 = &a;
printf("为什么是 %d\n",p1[0]);
printf("为什么是 %d\n",*p2[0]);
printf("为什么是 %d\n",p2[0]);
printf("为什么是 %d\n",sizeof (p1));
return 0;
}[/code
数组名不是数组的地址,而是数组第一个元素的地址,要想的到数组的地址,就需要的数组名去地址,这个地址和数组的第一个元素的地址在数值上相同,逻辑上却不一样,

------解决方案--------------------
a是一个指向数组的指针!
------解决方案--------------------
引用:

int (*p)[5]; //定义一个指向有5个元素的数组
int  a[5] = {1, 2, 3, 4, 5};
p = &a; //&a是什么意思?为啥用a不可以呢?a不是代表数组的首地址吗?


p = a不行,但是p=&a就可以,
不明白为什么
我是在vc6下编译的

//////////////////////////////////////////////////////////////////////////////
首先,楼主,你没弄清楚两个概念:
int (*p)[5];  这句话的意思是有5个int类型的数组,*p存放的是这个数组的首地址的地址;
int a[5],是一个有5个int类型的数组,首先这个a是一个常量地址,它不可以被赋地址值;
p指向的是a的首地址的地址,因此*p会得到a的首地址,因此只能把&a赋值给p;
这道题只说明你对指针的理解还不够,。。。。