【问题标题】:is &a[i] and &a[i-1]+sizeof(int) same if a is integer array如果 a 是整数数组, &a[i] 和 &a[i-1]+sizeof(int) 是否相同
【发布时间】:2015-01-05 01:10:04
【问题描述】:

我想知道 &a[i] 和 &a[i-1]+sizeof(int) 打印的地址值是否相同? 当我打印值时,它变得不同了。怎么样? eg.say a[0] 在 1000 和 a[1] 在 1002 ,那么 a[1] 和 &a[i-1]+sizeof(int) 其中 i=1 应该返回相同的权利吗?

代码sn-p:

{
   int a[3]={100,200,300};
   print &a[1] and print &a[0]+sizeof(int)
}

【问题讨论】:

  • 我想我理解了这个问题,但不清楚,请添加一些示例代码。
  • 他问它是否在任何情况下都连续映射到 ram 上
  • &a[i-1]+sizeof(int) --> &a[i-1]+1
  • 我认为 OP 的意思是int a;
  • @BLUEPIXY &a[i-1]+sizeof(int) --> 只有当sizeof(int) 等于1 时,&a[i-1]+1 才会为真。

标签: c arrays


【解决方案1】:

a 是数组类型,&a 是指针类型。 它们的类型不一样

这个&a+1 是指针算法。将 &a 增加 1 将使您到达数组中的最后一个位置 + 1。示例(假设size 为 5):

   |0|1|2|3|4| |
   a^         ^
          &a+1^

a 的类型是int[size](例如),它衰减到表达式a + 1 中第一个元素的地址,将一个结果指向a 中的第二个元素;而&a 的类型是int(*)[size]

再次强调他们的类型不一样。指针的类型决定了你接下来在内存中的位置,理论上它是这样的:

address2 = BlockAddress + sizeof(TYPE)*IncrementVal

【讨论】:

  • @mahashwetha - 在你的情况下是i
【解决方案2】:

当然不是。在几台机器上,sizeof(int) 是 4。&a[i-1]+sizeof(int)&a[i-1]+4,即 &a[i+3],即 a+i+3

指针上的加法(即p+n,其中p 是指针或数组,n 是整数)以p 引用的类型为单位工作。所以如果p指向一个1024字节的structp+1的地址比p大1024

【讨论】:

    猜你喜欢
    • 2014-12-29
    • 1970-01-01
    • 2015-08-26
    • 2019-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多