1

我意识到我对取消引用指针的值有些困惑,因为我正在阅读带有以下代码片段的 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 行,matrix 被声明(暂时定义)为由 3 个元素组成的数组,该数组由 10 个 int 类型元素组成。

第 4 行,arrPtr 被定义为指向由 10 个 int 类型元素组成的数组的指针。它也被初始化为一个10个元素的数组的ptr(即矩阵的第一行)

现在第 5 行,arrPtr 被取消引用,产生了实际的数组,所以它的类型是 10 个整数的数组。

我的问题:为什么数组的值,只是数组的地址,而与它的元素无关?

4

3 回答 3

1

数组变量的值matrix 数组,但是它(很容易)“降级”为指向其第一项的指针,然后您将其分配给arrPtr.

要查看这一点,请使用&matrix(has type int (*)[3][10]) 或sizeof matrix(equals sizeof(int) * 3 * 10)。

此外,该定义没有任何暂定性。

编辑:我错过了隐藏在代码注释中的问题:*arrPtris an object of type int[10],所以当你使用[0]它时,你会得到第一个项目,然后分配给它5

指针和数组被特意定义为类似的行为,这有时会令人困惑(在您了解各种怪癖之前),但也非常通用和有用。

于 2009-12-22T19:29:01.447 回答
0

我认为你需要澄清你的问题。如果你的意思是什么值,printf("%i", arrPtr);那么它将是数组的地址。如果你的意思是printf("$i",(*arrPtr)[0] );那么我们有一个更重要的问题。

于 2009-12-22T19:32:17.483 回答
0

在 C 中,数组几乎只是一个方便的东西。所有“数组”变量都是指向数据块开头的指针;正如 anint []等同于 an int*,即 int 在内存中的位置,anint [][]是一个双指针,anint**指向...的内存中的位置……另一个指针,它又指向一个实际的特定 int。

于 2009-12-22T19:32:32.750 回答