【问题标题】:In C, how does arithmetic between a pointer and an array work?在 C 中,指针和数组之间的算术是如何工作的?
【发布时间】:2012-10-23 12:27:28
【问题描述】:

y 的值应该是多少,为什么?

int x[] = { 1, 4, 8, 5, 1, 4 }; 
int *ptr, y; 
ptr  = x + 4; 
y = ptr - x;  

我认为 y 应该是 4*sizeof(int),但它给出的是 4。为什么?

【问题讨论】:

  • 为什么不编译运行呢?
  • 我运行它,我得到 y 为 4,但 y 是 4,我不明白
  • 我认为这是个好问题......?

标签: c pointers


【解决方案1】:

I think y should be 4*sizeof(int)

好主意,你猜怎么着?它正在提供4*sizeof(int),但您看的不对。 ;)

当你玩指针时,你在看地址,所以让我们看看一些地址

int x[] = { 1, 4, 8, 5, 1, 4 };

//Just for fun, what is the address of each element in the array?
printf("%#x, %#x, %#x, %#x, %#x, %#x\n", x+0, x+1, x+2, x+3, x+4, x+5);

ptr = x + 4;

printf("%#x - %#x\n", ptr, x);  // Give us the address of ptr in hex
                                // and give us the address of x
y = ptr - x;                    

printf("%d\n", y);

输出:

   x[0]         x[1]        x[2]        x[3]         x[4]       x[5]
0xbf871d20, 0xbf871d24, 0xbf871d28, 0xbf871d2c, 0xbf871d30, 0xbf871d34

   ptr           x
0xbf871d30 - 0xbf871d20

4

所以 ptr 是x+4(在你的情况下实际上是x + 4*sizeof(int)x+16)。我们将从x 或基地址中减去,所以实际的数学是0x30 - 0x20 = 0x10 或十进制16

您在输出中看到4 的原因是因为编译器知道您正在对int * 执行操作,所以它为您将16 除以sizeof(int)。不错嗯?

如果您想查看实际值,您需要执行以下操作:

int one, two;
...
one = (int)ptr;  //get the addresses, ignore the "type" of the pointer 
two = (int)x;
y = one - two;

现在y 会给你 0x10(hex) 或 16(dec)

【讨论】:

    【解决方案2】:

    应该是指向x开头的地址和x的第4个元素的地址之间的int数=> 4。

    来自 c99 标准:

    6.5.6 加法运算符

    9/ 当两个指针相减时,都指向 相同的数组对象,或数组的最后一个元素 目的;结果是两者下标的差 数组元素。

    要了解更多信息,请尝试搜索指针算法

    【讨论】:

      【解决方案3】:

      只需应用一些简单的代数

      if
          ptr = x + 4
      and
          y = ptr - x
      
      therefore
      
      y = (x + 4) - x
      
      hence y = 4 + x - x
      
      thus y = 4 + 0 
      
           y = 4
      

      编辑:解决评论

      这是 C,ptr 只是任何大小位的值。向其中添加一个数字(溢出的情况除外)只是某个整数+另一个整数(转换为适当的大小),因此删除原始数字会留下余数。由于我们只添加了 4(小于 int),这意味着将其隐式转换为 y int 没有问题。

      【讨论】:

      • 你在第二段中进一步迷失了我。换种说法-如果我打印出'x'的值和'ptr'的值,则差异大于4。但是x - ptr == 4。这不仅仅是添加一个数字并再次删除它。
      • +1 我的脑海里闪过同样的解释。这里不需要考虑指针算法。这只是一组简单的方程问题。
      • @sje397 - 是的,我相信你只是在做整数数学。恕我直言,指针方面只是一条红鲱鱼。当然,C 规范可能是具体的(希望如此)并将其作为一个特定的用例,但因为它只是 C 并且您使用的数字 (4) 远低于 MAX_INT 我看不出这只是一个隐式整数计算。
      【解决方案4】:

      如果二进制的操作数是'-'
      都是相同类型的指针,它被评估为

      (p-q)/sizeof(p 或 q 的类型)

      如果第二个操作数是整数
      那么

      p - sizeof(p)*q

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-01-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-05-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多