【问题标题】:C program address increment of array and array name数组和数组名的C程序地址增量
【发布时间】:2014-04-10 06:15:34
【问题描述】:
int arr[10]={1,2,3,4,5,6,7,8,9,10};
printf("%p,%p\n", arr, &arr);
printf("%p,%p\n", arr+1, &arr+1);
return 0;

对于这段代码,GCC 编译器返回

0xbfe41348,0xbfe41348
0xbfe4134c,0xbfe41370

第一行很清楚,没问题。但是第二行让我感到困惑。第一个地址移动到下一个int,所以在arr之后4个字节,清除。但是,对于&arr+1,我认为它会指向整个数组的末尾arr[10],所以它应该在地址中添加4*10。我是不是误会了什么?

【问题讨论】:

标签: c arrays memory-address


【解决方案1】:

你认为是对的,只能这样做。

因为&arr => 0xbfe41348

0xbfe41348 + 0x28(4*10 十进制) = 0xbfe41370

我想你是因为在十六进制数上加上十进制而感到困惑。

【讨论】:

  • 天哪,我忘了它是六边形...多么愚蠢的错误!谢谢你的提示。
【解决方案2】:

&arr 的类型是“指向 10 个数组的指针 int”。因此,当您向其添加一个 (&arr+1) 时,它会移动到下一个数组的开头,即 10 个int,比&arr 的开头多 40 个字节。

【讨论】:

  • 我不明白为什么这样的答案(没有增加任何内容,只是重新措辞问题正文中已有的内容)会得到如此多的支持。 Stack Overflow 上的某些人是否有追随他们的粉丝群,并为他们写的任何内容点赞?
  • @ThoAppelsin 这些重新措辞有时可能是 oooohhhh !!! (我现在明白了)因素....:)
  • @MudassirHussain 在这种情况下绝对不是,web rocker 已经明确表示他/她希望将 40 添加到地址中。可能永远不会出现在提问的人使用他自己的真实话语的任何情况下;只有当提问的人使用他尚未正确理解的引用解释时,重新措辞才有用,这里不是这种情况,这里没有任何引用解释。
【解决方案3】:

&arr+1 实际上将40 添加到数组arr 的基地址中,但它不是显而易见的,因为地址是十六进制或以16 为底的,而不是十进制的。

现在,不管它的价值是什么,我将对每个语句添加一些解释以使事情清楚。

int arr[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

上述语句将arr 定义为int[10] 类型,即10 整数数组。然后它使用数组初始化列表初始化arr

printf("%p,%p\n", arr, &arr);

在上述语句中,arr 衰减(计算或隐式转换)为指向其第一个元素的指针。因此它的类型是int *&arr 计算为指向 arr 的指针。 arr 的类型是 int[10]。因此,&arr 的类型为int (*)[10],即指向 10 个整数数组的指针。使用括号是因为数组下标运算符[] 的优先级高于* 运算符。所以没有括号 int *[10] 表示一个包含 10 个整数指针的数组。这是数组不会衰减为指向其第一个元素的指针的情况之一。

请注意arr&arr 的计算结果相同,即上述printf 语句中数组的基地址,但它们的类型不同,并且具有不同的指针算法。这显示在以下语句中 -

printf("%p,%p\n", arr+1, &arr+1);

arr+1 指向下一个元素。这里元素类型是int。因此arr+1 评估为

arr + (1 * sizeof(int)) 

&arr + 1 也指向下一个元素,但这里的元素类型是 int[10] - 一个由 10 个 integers 组成的数组。因此&arr + 1 评估为

arr + (1 * sizeof(int[10]))

【讨论】:

  • 非常感谢您的解释,我现在清楚多了。由于我在数据格式上犯了一个错误,并且接受的答案指出了这一点,所以我选择了它。不过还是非常感谢。
【解决方案4】:
arr+1

这里的 arr 是指向整数数组的基指针,所以结果会增加sizeof(int)

&arr+1

这里&arr 产生数组的地址,因此结果按数组大小递增。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多