3

我正在尝试理解 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;
  1. 第二个问题是第三行代码在做什么?

    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. 
    
4

2 回答 2

3

您已定义SortTableRowsintswith的数组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)
于 2013-03-06T23:41:49.427 回答
3

问题 1。

首先,您告诉它 SortTablesRow 是一个 20 个整数的数组。所以 SortTablesRow 是一种类型。在第二个中,您将创建一个名为 SortTablesRow 的变量,它是一个包含 20 个整数的数组。这不能用作类型,因为它是一个变量。

问题2。

在这里,您将 SortTablesRow 类型定义为 20 个整数的数组。然后你说 SortTablesRowPtr 是一个指向它的指针。所以现在你有一个指向 20 个整数的数组的指针。这本质上是一个int**。所以第一个数组索引索引第一个指针,第二个数组索引索引第二个指针(或数组),因此在 20 元素 int 数组中查找。

于 2013-03-06T23:43:44.157 回答