我意识到我对取消引用指针的价值感到困惑,因为我正在阅读带有以下代码片段的C文本:
int main()
{
int matrix[3][10]; // line 3: matrix is tentatively defined
int (* arrPtr)[10] = matrix; // line 4: arrPtr is defined and initialize
(*arrPtr)[0] = 5; // line 5: what is the value of (*arrPtr) ?
我的困惑在于最后一行中* arrPtr的值。这是我对此的理解。
第3行,矩阵被声明(暂定定义)为由10个int类型元素组成的3个数组元素的数组。
第4行,arrPtr被定义为指向10个int类型元素的数组的指针。它也被初始化为ptr到10个元素的阵列(即矩阵的第一行)
现在第5行,arrPtr被解除引用,产生实际的数组,因此它的类型是10个int的数组。
我的问题:为什么数组的值,只是数组的地址而不是与它的元素有关?
答案 0 :(得分:1)
数组变量matrix
的值是数组,但它(很容易)“降级”为指向其第一个项目的指针,然后将其指定给{{1} }。
要查看此内容,请使用arrPtr
(类型&matrix
)或int (*)[3][10]
(等于sizeof matrix
)。
此外,关于这个定义没有任何试验性。
编辑:我错过了隐藏在代码评论中的问题:sizeof(int) * 3 * 10
是*arrPtr
类型的对象,因此当您在其上使用int[10]
时,你得到第一个项目,然后你分配[0]
。
指针和数组被有目的地定义为行为相似,这有时令人困惑(在你学习各种怪癖之前),但也非常通用和有用。
答案 1 :(得分:0)
我认为你需要澄清你的问题。如果你的意思是printf("%i", arrPtr);
的值是什么,那么它将是数组的地址。如果你的意思是printf("$i",(*arrPtr)[0] );
那么我们就会有一个更加丰富的问题。
答案 2 :(得分:0)
在C中,数组几乎只是一种方便。所有“数组”变量都是指向数据块开头的指针;正如int []
等同于int*
,即int的内存中的位置,int [][]
是双指针,int**
,指向中的位置内存...另一个指针,它又指向一个实际的特定int。