【问题标题】:array name and pointer name confusion数组名和指针名混淆
【发布时间】:2021-12-27 19:48:51
【问题描述】:

在 C 语言中,数组是相同数据类型的集合,也就是当我们这样定义数组时:

int my_list[50];

我们在计算机内存中分配 50 个连续的位置来存储 50 个整数。

当有人说我的数组是“my_list”时,这是什么意思?它是统称我在内存中定义的所有 50 个空间吗?

如果是这样的话,当我尝试学习指针时,他们说,不,不,有一个名为“my_list”的指针,它指向 my_list[0];

我的结论是这样的: “my_list”确实表示所有 50 个内存位置,但是当我们定义数组时,机器正在生成一个名为“意外”“my_list”的指针,它指向 my_list[0] ;

array my_list 表示所有 50 个位置,指针 my_list 只指向 my_list[0],尽管它们的名称重叠,但它们是完全不同的东西。

如果我错了,请纠正我。

【问题讨论】:

    标签: c


    【解决方案1】:

    它是否统称为我在内存中定义的所有 50 个空间?

    是的,my_list 是数组。

    ……他们说,不不,有一个名为“my_list”的指针,它指向my_list[0];

    “他们”是错误的。没有名为my_list 的指针。

    但是,当在表达式中使用数组时,它会自动转换为指向其第一个元素的指针,除非它是 sizeof 的操作数、一元 & 的操作数或字符串文字用于初始化数组。

    因此,例如,如果您像使用指针一样使用my_list,如int *p = my_list + 5;,或者将它传递给函数,如foo(50, my_list);,那么它会自动转换为指针,就像你写过int *p = &my_list[0] + 5;foo(50, &my_list[0]);

    对于例外情况:sizeofsizeof my_list 给出了整个数组的大小,大小为 50 int。没有自动转换为指针,所以sizeof my_list 没有给出指针的大小。对于一元 &&my_list 是一个类型为“指向 50 个数组的指针 int”的指针,而不是类型为“指向 int 的指针的指针”的指针。

    (你用名字声明的数组,比如my_list,当然不是字符串字面量。字符串字面量可以用来初始化一个数组,比如char MyString[] = "Hello";。在这种情况下,数组由字符串字面量用于初始化buffer;它不会转换为指针。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多