【问题标题】:Array name and pointer数组名和指针
【发布时间】:2021-12-30 11:01:24
【问题描述】:

我正在阅读这个答案- https://stackoverflow.com/a/1644292/10352155

看完之后,我有一些疑问:

答案中说,一旦数组表达式“衰减”为指针,你所拥有的只是一个指向单个元素的指针。

这是否意味着当数组表达式被转换为指针时,需要分配一个额外的内存空间(除了已经为数组元素分配的内存空间)来存储指针表达式(就是数组的基地址)?

如果是这样,那么它与 B 语言中提到为指针表达式分配单独的内存空间有什么不同?

如果不是这样并且没有分配额外的内存,那么指针表达式如何存储基地址的值?

【问题讨论】:

  • 没有更多的分配。指针保存的唯一信息是地址,编译器知道类型。 C 允许您根据需要从指针索引,但您需要确保目标内存在原始对象内。

标签: arrays c pointers


【解决方案1】:

很明显,数组总是在同一个内存位置,它不会改变,你不能移动它也不能转换它,一旦声明它将在整个过程中占用相同的内存空间存在,它将用于相同的目的,存储声明类型的元素。不需要额外的内存,唯一使用的内存是数组元素本身。

数组的名称不是元素,它只是为了参考和简化编程过程,它被编译掉了,因为C没有反射它不需要,编译器只需要数组地址和就是这样保留的,它也会知道元素的个数和元素的大小,所以你可以使用sizeof来渲染它占用的总内存空间。

衰减过程通常发生在赋值或将数组作为参数传递时,最终得到的是一个指向现有数组的新指针,该指针将包含数组初始元素的地址,仅此而已.

该指针必须被存储,因此,根据情况,系统知道指针的大小,它是由实现定义的。

如果你使用手动内存分配,那么指针和数组的内存空间也必须存储在堆中。

这也意味着您不能再像使用数组本身那样使用sizeof 知道数组的大小,而是获取指针的大小。

【讨论】:

    【解决方案2】:

    转换是在计算表达式的过程中完成的。原始数组没有改变。例如,在:

    int x = 3;
    int y = 4;
    int z = x*y + 7;
    

    xy 的乘积被计算为 12,但这只是在算术中使用。 xy 均未更改。

    同样,在:

    int a[] = { 0, 1, 2, 3 };
    int *p = a + 2;
    

    a 的第一个元素的地址是由编译器计算出来的(基于它知道a 的存储位置),a 不会因此而改变。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-22
      • 1970-01-01
      • 1970-01-01
      • 2011-08-24
      • 1970-01-01
      • 2023-03-11
      相关资源
      最近更新 更多