5

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

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

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

4

4 回答 4

8

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或在 dec 中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)

于 2012-10-23T13:10:33.987 回答
7

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

从 c99 标准:

6.5.6 加法运算符

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

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

于 2012-10-23T12:28:55.917 回答
4

只需应用一些简单的代数

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 没有问题。

于 2012-10-23T12:32:39.633 回答
2

如果二进制“-”的操作数
都是相同类型的指针,则评估为

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

如果第二个操作数是整数
,则

p - sizeof(p)*q

于 2012-10-23T12:55:21.997 回答