【问题标题】:2D Arrays and Pointers - C2D 数组和指针 - C
【发布时间】:2010-10-08 09:28:03
【问题描述】:

只是想真正了解 C 中的数组和指针以及它们之间的差异,并且在使用 2d 数组时遇到了一些问题。

对于普通的一维数组,这是我学到的:

char arr[] = "String constant";

创建一个字符数组,变量arr将始终表示初始化时创建的内存。

char *arr = "String constant";

创建一个指向 char 的指针,该指针当前指向 char 数组“字符串常量”的第一个索引。指针可以稍后指向其他地方。

char *point_arr[] = {
    "one", "two","three", "four"
};

创建一个指针数组,然后指向字符数组“一”、“二”等。

我的问题

如果我们可以同时使用:

char *arr = "constant";

char arr[] = "constant";

那为什么我不能用:

char **pointer_arr = {
    "one", "two", "three", "four"
};

而不是

char *pointer_arr[] = {
    "one", "two", "three", "four"
};

如果我尝试 char ** 的事情,那么我会收到类似“标量初始化程序中的多余元素”的错误。我可以通过使用calloc 专门分配内存来使char** 示例工作,但因为我不必对char *arr = "blah"; 执行此操作。我不明白为什么它是必要的,所以我真的不明白两者之间的区别:

char **arr_pointer;

char *arr_pointer[];

非常感谢您的建议。

【问题讨论】:

  • 相当确定这是重复的...
  • 稍微相关一点,第二、第三和第四个例子应该是const
  • @Matteo: const 字符串文字的风格很好,但在 C 中不是必需
  • @schot:这不是必需的,但 IIRC 将字符串文字的const char * 隐式转换为char * 只是出于兼容性原因,并且可能(我不确定)甚至在 C99 中已被弃用。

标签: c arrays pointers


【解决方案1】:

this answer in the C FAQ

这里解释了char []char *。同样的事情可以扩展到char *[] vs char **

【讨论】:

    【解决方案2】:

    简而言之,您不能将{ ... } 用作标量的初始化程序。

    char **arr_pointer 声明一个标量,而不是一个数组。相比之下,您可以使用 char *arr = "constant"; 的原因是因为您仍在声明一个标量,它恰好指向一个字符串文字。

    【讨论】:

    • 严格来说,您可以使用{...} 作为标量的初始化器。在 C 中 int x = { 5 } 是完全合法的。编译器抱怨 excessive 初始化程序。虽然 OP 的问题与此无关......
    【解决方案3】:

    如果您真的想深入了解它,请尝试通过整数而不是字符来理解数组和指针。根据我的经验,当涉及字符时,我很难理解指针和数组。一旦你正确理解了整数,你就会意识到它根本不是差异。

    int *ptr[] 是指向整数的指针数组,其中 int **ptr 是指向引用整数的指针的指针。

    int *arrptrs[2];
    arrptrs[0]=(int *)malloc(sizeof(int)*5);
    arrptrs[1]=(int *)malloc(sizeof(int)5);
    这将初始化由数组 arrptrs 的元素引用的两个数组。数组的名称是指数组的第一个元素的内存位置,因此 arrptrs 的类型为 (int *
    ),因为该数组的第一个元素的类型为 (int *)

    假设我们这样做 int **ptr=arrptrs 然后, *ptr 是 arrptrs 的第一个元素,它是 arrptrs[0] 并且 *(ptr+1) 是 arrptrs[1] 并且执行 *arrptrs[0] 是 arrptrs[0] 引用的数组中的第一个元素。

    我希望这会有所帮助,虽然我不确定你是否需要这个。

    【讨论】:

      【解决方案4】:

      指针 (char *pointer;) 有值;数组 (char array[];) 有元素。

      声明char **ptr2 声明了一个可以接受单个值的对象,而不是可以接受多个元素的对象。

      【讨论】:

        【解决方案5】:

        引用自维基百科:

        在计算中,标量变量或字段一次只能保存一个值... ...例如,char、int、float 和 double 是 C 编程中最常见的标量数据类型语言。

        所以正如 Oli Charlesworth 在他的回复中指出的那样,使用 {.....} 初始化多个项目,但由于 char **arr_pointer 是一个“标量”,因此一次只能指向一个事物(一个地址)然后{...} 符号不能在这里工作。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-04-13
          • 2019-06-29
          • 1970-01-01
          • 2016-12-02
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多