考虑这个 C 程序
int main()
{
int arr[][3] = {1,2,3,4,5,6};
int **p= &arr;
printf("%u %u" , *p, *(p+1));
return 0;
}
一些编译器给出的输出为 1,4 一些编译器给出类型兼容的错误
根据我的说法,我们需要双重取消引用才能获得正确的值,如果我们有一个二维数组,那么双指针不会指向它的第一个元素,那么为什么我们会收到类型兼容错误以及为什么仅引用一次数组元素?
尽管是一个 2D 数组,
arr
仍然被视为 int*
,而不是双指针。唯一的区别是元素的访问方式略有不同。
在程序内存中
arr
是指向int
的普通指针,而p
是int**
类型。此外,您还尝试打印 *p
(这将成为 int*
类型),同时将其格式化为 unsigned
,因此您收到不兼容的类型错误才有意义。
总之,如果您想使用
arr
访问 p
中的元素,公式将为 *(p + 3 * row + column)
。