C语言中int (*p)[4]与int **p的区别

2025-03-11 04:14:39
推荐回答(5个)
回答1:

经过两天的上机试验和自己的推理,我要感谢的是dukehhh同志,我是沿着你的想法推理下去的,你的想法是正确的,而且我还帮你进行了补充:
int *p;是一个指针变量,与之相对应的是int p[n];
int (*p)[4];//是指向一个2维数组的指针,与之相对应的是int p[][4];
int **p;//是指向一个指针的指针 ,与之相对应的是int *p[n],它们都是指向字符串的指针数组,而且二位动态数组开辟后只能将值赋予它(**p),因为只有它的数据结构才能满足;
两个都是指向地址的 。
很多朋友为二维动态数组的数据结构感到困惑,现在我将我对它的分析先给大家,希望对大家能有一些帮组:
先通过p=(int **)malloc(n*sizeof(int *));相当分配了n个连续的int *类型的内存空间,它们的地址是相连的,即p[n]数组,其类型是int *类型,现在为数组中的每个变量(p[0]、p[1]、p[2]…p[n-1])赋值,赋的值都是地址值,也就是for(i=0;ip[i]=(int *)malloc(m*sizeof(int));其中,每个p[n]相当于一维数组的数组名,由于内存分配函数分配内存是随机的,所以这n个一维数组并不是相连的,这与二维静态数组中的每个一维数组的地址是相连接的不同。

回答2:

这两个p的定义是不兼容的, 就是说如果你定义一个 int **a , int (*b)[4],他们之间互相赋值必须经过强制类型转换,否则编译器通不过。

但是并不是说这两者之间有多大的差别, 很多时候他们之间的互相赋值是合理的。

我已经说的很清楚了, 类型之间谈相等没有任何意义。 类型之间主要就是兼容性, 这两个按语法规则就是不兼容。 至于你说的“含义”相同与否,含义这个东西语法是不认的,含义是不是相同看你脑子里怎么想。 要知道,你脑子里的程序跟编译器眼里的东西不是一回事的

回答3:

不相等,int(*p)[4]是4个指向一唯数组的指针,int **p是一个指向二维数组的指针。从定义角度出发是不一样的

回答4:

就像百地瓜说的啊,一般int(*p)[4]要用的时候都是要带着下标,除了作为实参的时候.

回答5:

int (*p)[4];//是指向一个2维数组的指针
int **P;//是一个指针的指针
两个都是指向地址的
int (*p)[4] 是接收二维数组的地址(常量)
int **p 是接收指针变量的地址(变量)

我是这么理解的,不知道对不。