繁体   English   中英

对C指针的怀疑

[英]doubts about C pointers

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

你已经使用int SortTableRows[20]SortTableRows定义为ints的数组。 该标识符现在固定为数组,不能用于其他任何内容。 然后你尝试将它用作声明指针的类型(我认为)。 如果你想声明一个指向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。

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

问题2。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM