一个关于指针占用空间的问题

来源:百度知道 编辑:UC知道 时间:2024/05/15 08:27:43
#include <stdio.h>
void main()
{
char **a1[3][4];
char **p;
p = a1;
printf("%d\n", sizeof(p));
printf("%d\n", sizeof(a1));
}

试验用程序,主要是问这个的空间**a1[3][4],一个指向指针型数组的指针,那也应该还是个指针啊,不应该是指针的固定大小4吗?为什么是3*4*4=48.
楼下几位的回答都很好,但是还是想问char **a1[3][4]应该是个指向指针数组的指针的吧,应该是当数组类型看的吗?那么和char *a1[3][4]又有什么区别呢?呵呵,如果没有回答的话分数给最先回答的朋友了,谢谢!

a1是个指针类型的数组
不妨把"char **"指针类型当作一个简单类型
这个类型的大小是4字节(注意,这仅仅针对特定的情形,指针类型变量的大小和编译环境设置有关),
那么这个类型的3*4的数组占有的空间当然是3*4*4=48字节了。

比如:
int i[3][4];
sizeof(int)=4, 那么sizeof(i)=3*4*4;

char ** a1[3][4];
sizeof(char**) = 4,那么sizeof(a1)=3*4*4; 和上面int情形一样。

个人不建议使用指针的指针这种比较不利于代码阅读的形式。

#include <stdio.h>
int main()
{
char b[4];
char p1[3][4];
char **a1[3][4];
char **p;
p = a1;
printf("%d\n", sizeof(p));
printf("%d\n", sizeof(a1));
printf("%d\n", sizeof(p1));
printf("%d\n", sizeof(b));
system("pause");
return 0;
}

dev-c下编译运行
输出:
4
48
12
4

解释:
char **a1[3][4];这是一个定义一个二维数组,二维数组里头的每一个元素都是一个指向指针的指针。
char **p。这里是定义一个指向指针的指针。
p = a1;是吧二维数组的首地址赋值给p。即把a1[0][0]的地址赋值给p。所以你上面的定义p的方法是错误的。应该是char ***p;
p本质上是一个