我想了解 C 中的基本概念。我有两个问题:
1.为什么下面一段代码可以运行而另一段不行?
/* This works fine */
typedef int SortTableRows[20];
SortTableRows* SortTableRowsPtr;
/* This will give error --> subscripted value is neither array nor pointer*/
int SortTableRows[20];
SortTableRows* SortTableRowsPtr;
第二个问题,第三行代码是做什么的?
typedef int SortTableRows[20]; SortTableRows* SortTableRowsPtr; SortTableRowsPtr[2][3]=2; //Why the compiler doesnt give any error?how can we use a pointer as a 2d array.
最佳答案
您已将 SortTableRows
定义为 ints
和 int SortTableRows[20]
的数组。该标识符现在固定为一个数组,不能用于任何其他用途。然后你试图将它用作一种类型来声明一个指针(我认为)。如果你想声明一个指向整数数组的指针,你可以这样做:
int *SortTableRowsPtr;
SortTablesRowPtr = SortTablesRows;
在第二个问题中,您将一个值赋给一个指针,该指针指向您将其视为二维数组的指针,这对您的编译器没有实际影响(尽管在这种情况下没有实际意义) ,因为“多维”数组以线性方式存储在内存中,与单维数组相同。您的 typedef
在这里没有任何实际意义,因为您正在定义一种数组,然后为它创建一个未初始化的指针(这会创建一个 int **
) , 并像它指向有效的东西一样访问它(它会编译,但肯定会崩溃)。
要完成这项工作,您需要定义一个包含 20 个整数的数组,然后指向它:
SortTablesRows table[10] = {}; // equivalent to int table[10][20];
SortTablesRowPtr = table;
之所以可行,是因为您声明了一个指向 20 个整数的数组的指针,即
int (*SortTablesRowPtr)[20];
我已经扩展了这个答案。它有助于更简单地逐步解释它。拿一张 3 行 10 列的表格。这是定义的:
int table[3][10];
然后您可以设置指向该表的指针。因为它是二维的,所以这是不对的:
int *ptr = table; // wrong - incompatible pointer
但这会指向第二行(和第一列):
int *ptr = table[1];
换句话说,您需要一个指向 10 个整数的数组的指针,即您需要一个指向 int n[10]
类型的指针。为此,您可以这样写:
int (*ptr2)[10] = table;
现在您可以使用 ptr2
以指针、数组或两者的形式直接访问表。就目前而言,它指向第一行和第一列。如果您将一个添加到 ptr2
,它将选择下一行。
ptr2[1][3] = 3; // change row 2, column 4
(*(ptr2 + 1))[4] = 10 // row 2, column 5 (yuck)
关于c - 关于C指针的疑惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15260320/