gpt4 book ai didi

c - 如果 'a' 在 C 中是一个整数数组,为什么 'a + 1' 和 '&a + 1' 不同?

转载 作者:行者123 更新时间:2023-12-01 12:32:16 24 4
gpt4 key购买 nike

#include<stdio.h>
int main(){
int a[2] = {0, 1};
printf("%d\n",a);
printf("&a + 1 %d\n",&a + 1);
printf("a + 1 %d\n",a + 1);
return 0;
}

结果如下:

6422232

&a + 1 6422240

a + 1 6422236

为什么 &a + 1a + 1 不同?

最佳答案

&a+1中,&a取数组的地址。这会产生一个指向数组的指针,因此加一会增加一个数组的大小。这是因为每种类型的指针都有自己的测量单位——加一个总是加一个指向的对象。

a+1中,a就是数组本身。 C 自动将数组转换为第一个元素的地址。因此,a 生成一个指向元素的指针,因此加一会增加一个元素的大小。

(在 &a+1 中,a 不会自动转换为指向第一个元素的指针。对数组使用 & 是一个转换异常(exception)。请参阅下面的注释 1。)

注意事项

  1. 在大多数情况下,数组会自动转换为指向其第一个元素的指针。当数组是 sizeof&_Alignof 的参数时,或者当数组是用于初始化一个字符串文字时,它不会发生数组。

  2. 在 C 的模型中,指针使用它指向的任何类型的对象的单元。所以说“增加一个数组的大小”有点不准确。但是,如果我们谈论使用对象数组中的有效指针导航存储,则从一个对象移动到另一个对象会遍历等于对象大小的字节数。

  3. 您不应该使用 %d 打印指针。 C 标准未定义其行为。要打印指针,将其转换为 void * 并使用 %p 打印:

    printf("%p\n", (void *) a);
    printf("&a + 1 %p\n", (void *) (&a + 1));
    printf("a + 1 %p\n", (void *) (a + 1));
  4. 请注意,%p 不一定会产生实际的内存地址。 C 标准允许实现产生指针的一些其他表示。在没有复杂内存模型的良好 C 实现中,%p 将打印指向对象的内存地址。但是,这是一个实现质量特征。

关于c - 如果 'a' 在 C 中是一个整数数组,为什么 'a + 1' 和 '&a + 1' 不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48199120/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com