C语言二级指针int **a ,int (*a)[5]和int *(a[5])的各是什么含义

最好有关于这个问题的连接,因为这不是一句两句能说清楚的,包括动态分配二级指针,要new/delete和malloc/free都有的,以前看过关于这个问题的链接,现在找不到了。。。

int **a是int型的指针的指针,int(*a)[5] 是指针数组,可以理解为这个指针返回的是数组,最后一个是数组指针,就是*a[5],5维数组,每个元素都是一个指针,通用的说都是类似a[][]的,只是在编译器执行的时候会有不同,编译器执行时会把a[][]转换成(*)a[],*a[]会转换成**a,(*)a不会变,**a也不会变,这就是涉及到编译器内部机理了,还有数组指针关系!估计二级不好考这么深!
温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-04-24
int **a; 就是指向指针的指针啊;
int (*a)[5]; 就是数组指针,表示指向一个大小为5的整型数组。a++的距离就是5*sizeof(int);
int *a[5]; 就是指针数组,表示数组里面存的都是指针,a++的距离不过是一个整型指针的距离,大小一般为4.

假设分配一个4x3的二维空间
int **a;
//new
a = new (int*)[4];
for(int i=0;i<4;i++)
{
*(a+i) = new int[3];
}

//delete (与new顺序相反)
for(int i=0;i<4;i++)
{
delete [](a[i]);
}
delete []a;追问

int (*a)[5]; 就是数组指针,表示指向一个大小为5的整型数组。a++的距离就是5*sizeof(int);
int *a[5]; 就是指针数组,表示数组里面存的都是指针,a++的距离不过是一个整型指针的距离,大小一般为4.
你两个a++距离说错了,因此无法给你分数。。。
int (*a)[5]是一个指向“一群”数组的指针,因此只是一个指针,大小为4。
int *a[5]是5个指向指针的指针,因此为5*sizeof(int)

追答

请你用VC打印一下地址看看,到底是我错了还是你错了,谢谢!
PS:作为数组指针,虽然a是一个指针,其大小为4,但是a++,表示指向下一个数组,跳过的距离是整个数组的长度。
数组指针,一个元素就是一个指针,跳过的元素也就是一个指针的距离,大小为4。

追问

你仔细看看你原文怎么写的,我追问的上半部分是复制你写错的内容,并且我也试验过了。
int (*a)[5] sizeof(a)结果为4,a它只是一个指针,这个指针指向了无数个大小固定为5的数组。
int *a[5] sizeof(a)结果为20,a它可以说是一个数组它的长度决定于[]内数字的大小

追答

我难道不知道int (*a)[5]是一个指针吗,我是指a++的地址减去a的地址,难道是等于sizeof(a)吗,滑天下之大稽

追问

求int (*a)[5]和int *a[5]如何求a++与a的距离,还有,sizeof(a)不能说明a++到a的距离吗???求解释

追答

#include

int main()
{
int (*a)[5];
int b[4][5];

a = b;
a++;
printf("%d\n",a);printf("%d\n\n",b);

int *c[5];
printf("%d\n",&c[1]);
printf("%d\n",&c[0]);
return 0;
}

第2个回答  2012-04-24
http://wenku.baidu.com/view/29f81bbafd0a79563c1e7238.html
这个很详细
我也是看这个的当初追问

这个链接的下半部分是我以前看见过的,我想找的就是那个,但是想要原文,原文当中还有malloc和free的举例,这个链接虽然在百度文库,但是也是转载并且不全。。。

本回答被提问者采纳
相似回答