经过两天的上机试验和自己的推理,我要感谢的是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;i
这两个p的定义是不兼容的, 就是说如果你定义一个 int **a , int (*b)[4],他们之间互相赋值必须经过强制类型转换,否则编译器通不过。
但是并不是说这两者之间有多大的差别, 很多时候他们之间的互相赋值是合理的。
我已经说的很清楚了, 类型之间谈相等没有任何意义。 类型之间主要就是兼容性, 这两个按语法规则就是不兼容。 至于你说的“含义”相同与否,含义这个东西语法是不认的,含义是不是相同看你脑子里怎么想。 要知道,你脑子里的程序跟编译器眼里的东西不是一回事的
不相等,int(*p)[4]是4个指向一唯数组的指针,int **p是一个指向二维数组的指针。从定义角度出发是不一样的
就像百地瓜说的啊,一般int(*p)[4]要用的时候都是要带着下标,除了作为实参的时候.
int (*p)[4];//是指向一个2维数组的指针
int **P;//是一个指针的指针
两个都是指向地址的
int (*p)[4] 是接收二维数组的地址(常量)
int **p 是接收指针变量的地址(变量)
我是这么理解的,不知道对不。