c - 关于C指针的疑惑

标签 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. 
    

最佳答案

您已将 SortTableRows 定义为 intsint 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/

相关文章:

c - scanf 和 printf 不打印正确的值

c - inet_pton() 函数只给出 ip 或 ip 和端口号?

c - 在 Windows 上使用 __cdecl 了解 C 函数调用序言

c - 用 C 语言求解二维数组迷宫

c - 如何禁用 Windows 7 上的开始按钮(而不是任务栏)?

将 wchar_t 转换为 CFStringref

C线程创建树

c - 是什么导致段错误?

c - 带函数的 while 语句

c++ - C/C++ 代码的等效 asm 代码