【问题标题】:Why address of i+2 is not 653064?为什么 i+2 的地址不是 653064?
【发布时间】:2015-02-19 06:19:27
【问题描述】:

我正在学习 C 中的指针。我对指针算术感到困惑。看看下面的程序:

#include<stdio.h>
int main() 
 {
  int a[] = 2,3,4,5,6;
  int *i=a;
  printf("value of i = %d\n", i); ( *just for the sake of simplicity I have use %d* ) 
  printf("value of i+2 = %d\n", i+2); 
  return 0;
  } 

我的问题是如果 i 的值是 653000 那么为什么 i+2 的值是 653008据我所知,内存中的每一位都有指定的地址,那么根据 i+2 的值应该是 653064 因为 1 字节 = 8 位。为什么指针算术用字节缩放,为什么不用位? 提前感谢,对不起我的英语不好!

【问题讨论】:

  • i+1 指向下一个元素。编译器知道 i 指向一个整数,大小为 4 个字节。为了获取下一个字节的地址,将 i 转换为一个字节*
  • "just for the sake of simplicity I have use %d"No. 指针以十六进制显示,带有"%p" 格式说明符。
  • @JonathonReinhart:我认为,为了简单,可以使用 %d
  • @alzaimar 没有。没有额外的简单性。如果一个人不能理解十六进制表示法,那么就不应该使用指针。更不用说,如果启用并注意编译器警告(例如gcc -Wall),当printf 期待一个整数时,你会立即意识到你正在传递一个指针 >,可能是不同的大小。
  • @alzaimar 这就是为什么我在 comment 中提到它,而不是答案。您正在分散实用建议的注意力。

标签: c pointers memory-address pointer-arithmetic


【解决方案1】:

据我所知,内存中的每一位都有指定的地址

错了。

为什么指针算术用字节缩放,为什么不用位?

byte 是计算机上的最小可寻址存储单元,而不是 bit。地址指的是字节 - 您不能创建指向内存中特定位的指针1

Addresses refer to *bytes*
  |
  |
  v     _______________
0x1000 |_|_|_|_|_|_|_|_|    \
0x1001 |_|_|_|_|_|_|_|_|     > Each row is one byte
0x1002 |_|_|_|_|_|_|_|_|    /

       \_______ _______/
               v
       Each column is one bit

正如其他人所解释的,这是pointer arithmetic 的基本操作。当您将n 添加到指针*p 时,您添加的是n 元素,而不是n 字节。您实际上是将 n * sizeof(*p) 字节添加到指针的地址。

1 - 不使用 Bit-banding on ARM 等特定于架构的技巧,如 myaut pointed out

【讨论】:

  • 为什么?如果字节是位形式,那么根据这个 i+2 应该是 653064
  • 没有。别再提比特了,它们在这里完全无关紧要。指针和地址仅指字节
  • > 您无法创建指向内存中特定位的指针。接受挑战! infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0337h/…
  • @myaut 太棒了。我已更新我的答案以添加此异常。感谢您指出这么酷的功能。
【解决方案2】:

您应该阅读评论中给出的指针算法。link

在增加指针的位置时,将根据该指针的数据类型增加。在这种情况下,i+2 会将字节增加到 八个字节。

整数是四个字节。(系统定义)。所以i+2 将充当i+(2*sizeof(int))。所以它会变成i+8。所以答案增加了八。

地址是按字节计算的。不是一点。取一个字符指针。每个字节有 255 位。

考虑这样的字符串。 `“嗨”。它会像这样存储。

  h     i
  1001  1002 

h 的 Ascii 值为104。它将存储在一个字节中。有符号字符,我们可以在 0 到 127 中存储正数。因此,存储一个值我们需要字符数据类型中的一个字节。使用这些位我们不能存储唯一的值。所以指针算法是基于字节的。

【讨论】:

  • 对不起,我不得不投反对票。您没有解决 OP 存在的基本误解,他认为个人 bits 是可以解决的。
  • @JonathonReinhart,如果我的解释有误,请告诉我。
【解决方案3】:

当你做 PTR + n 时,简单的数学就会像

PTR + Sizeof(PTR)*n.

这里整数指针的大小是4字节。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-05-03
    • 1970-01-01
    • 2019-04-26
    • 1970-01-01
    • 2022-01-02
    • 2011-02-02
    • 2020-09-09
    相关资源
    最近更新 更多