我试图理解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.
答案 0 :(得分:3)
您已将SortTableRows
定义为ints
与int 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数组。