假设我将二维数组声明为:
int a[10][10];
根据我的理解,a是int类型的双指针。
假设我声明了一个指向整行的指针,如下所示。
int (*p)[10];
同样a[0]
指向第0行,a[1]
指向第1行......依此类推。
所以我尝试将p初始化为
p = a[0]; /* so that p can point to row 0 */
我收到编译器警告指示不兼容的指针。 但如果我写
p = a;
这很好用。
有人可以告诉我这里的错误吗?
答案 0 :(得分:4)
根据我的理解,a是int类型的双指针。
你错了。 a
是int
数组的类型数组。数组名称转换为指向其第一个元素的指针,除非它是sizeof
和一元&
的操作数。
同样
a[0]
指向行0
,a[1]
指向行1
..依此类推。
没有。 a[0]
指向行0
的第一个元素,a[1]
指向衰减后行1
的第一个元素。 &a[0]
会为您提供行0
p = &a[0]; // Equivalent to p = a
答案 1 :(得分:1)
a
不是双指针。它是由10个整数组成的十个数组的数组。在大多数用途中,它会'衰变'#34;到类型为int (*)[10]
的指针,即指向第一行的指针。
因此,在p = a
作业中,a
如上所述衰减,因此p
指向第一行。
如果您想指向另一行,则需要明确地使用它的地址:
p = &a[5]
答案 2 :(得分:1)
a是int类型的双指针。
没有。 a
是一个int数组数组。
此外,[0]指向第0行
没有。 a[0]
是的第一行,是一个int数组。要指向到第一行,您需要执行&a[0]
。
大多数情况下,您可以将&a[0]
写为a
,因为大多数(但不是全部)上下文中的数组表达式被隐式转换为指向其第一个元素的指针。 / p>
答案 3 :(得分:0)
您只需使用其名称,就可以始终指定指向数组,字符串或函数的指针。即,如果 a [10] 是10个整数元素的数组,则可以使用表达式 p = a 指定指针p,现在&#39; a& #39; 将给出数组的基址。因此,&#39; <&#39; 现在指向一个包含10个元素的数组。
相同的概念可以应用于字符串和函数..