y 的值应该是多少,为什么?
int x[] = { 1, 4, 8, 5, 1, 4 };
int *ptr, y;
ptr = x + 4;
y = ptr - x;
我认为 y 应该是 4*sizeof(int),但它给出了 4。为什么?
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)
它应该是指向起始x
地址和 x 的第 4 个元素的地址之间的 int 数 => 4。
从 c99 标准:
6.5.6 加法运算符
9/ 当两个指针相减时,都应指向同一个数组对象的元素,或者指向数组对象的最后一个元素;结果是两个数组元素的下标之差。
要了解更多信息,请尝试搜索指针算术。
只需应用一些简单的代数
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 没有问题。
如果二进制“-”的操作数
都是相同类型的指针,则评估为
(pq)/sizeof(p 或 q 的类型)
如果第二个操作数是整数
,则
p - sizeof(p)*q