对C指针的怀疑

时间:2013-03-06 23:36:57

标签: c

我试图理解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. 
    

2 个答案:

答案 0 :(得分:3)

您已将SortTableRows定义为intsint SortTableRows[20]的数组。该标识符现在固定为数组,不能用于其他任何内容。然后你尝试将它用作声明指针的类型(我认为)。如果你想声明一个指向int数组的指针,你可以这样做:

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数组的指针,即你想要一个指向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)

答案 1 :(得分:3)

问题1。

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

问题2。

在这里,你输入的SortTablesRow是一个20个整数的数组。然后你说SortTablesRowPtr是指向它的指针。所以现在你有一个指向20个int数组的指针。这基本上是一个int **。因此,第一个数组索引索引第一个指针,第二个数组索引索引第二个指针(或数组),从而查找20个元素的int数组。