【发布时间】:2021-03-27 18:36:14
【问题描述】:
我不明白为什么在取消引用指向数组的指针时,结果是数组第一个值的地址
int array[2][2] = {{0,1},{0,1}};
int (*p)[2];
p = array;
p = address of a[0][0], p+1 = address of a[1][0],
*p = address of a[0][0], (*p)+1 = the address of a[0][1];
我知道 p 是指向 2 个整数数组的指针,而不是指向整数的指针。但是如果我们打印出 p 的值,它仍然是一个整数的地址。我想知道引擎盖下发生了什么? p 是指向指针数组的指针吗?所以我们必须解引用它两次才能得到它所指向的整数的值?
指向 int 的指针,
int* p;
是一个变量,存储在一个位置,其中包含另一个变量 (int) 的地址。
当我们取消引用它时,我们会得到那个变量的值。这个过程如何与指向数组的指针完全一致?
【问题讨论】:
-
关于
p = array;不兼容的指针类型的赋值,您的警告说明了什么?int (*p)[2];是合适的。 -
好的,我刚刚更正了
-
在谈到数组及其与指针的关系时,您需要记住两件事。第一个是数组本身衰减为指向其第一个元素的指针。这意味着
array与&array[0]完全相同。第二件事是对于任何数组或指针array和索引i,表达式array[i]完全等于*(array + i)。 -
二维数组是一个一维数组的数组。
p指向array中的第一个一维数组。所以p指向array[0]和p+1指向array[1]。回想一下,在访问时,数组被转换为指向其第一个元素的指针。所以*p将指向第一行的第一个元素(它与*(p+0)相同,与p[0]相同) -
而在处理数组和指针的时候,我真的建议你把它们画在纸上。对单个变量使用正方形,对数组使用矩形(划分以显示元素),对指针使用箭头。它通常有助于了解事物的概况。