我有一段用C编写的代码,其中执行了一些指针算法。我想知道输出是怎么来的?
#include <stdio.h>
int main()
{
char arr[] = "gookmforgookm";
char *ptr1 = arr;
char *ptr2 = ptr1 + 3;
printf ("ptr2 - ptr1 = %d\n", ptr2 - ptr1);
printf ("(int*)ptr2 - (int*) ptr1 = %d", (int*)ptr2 - (int*)ptr1);
getchar();
return 0;
}
输出如下:
ptr2 - ptr1 = 3
(int*)ptr2 - (int*) ptr1 = 0
答案 0 :(得分:6)
严格来说,您正在调用未定义的行为,并且根据C标准,程序生成的任何结果都是正常的。
但是,你可能在sizeof(int) == 4
(而不是2)的机器上。由于整数有4个字节,因此相隔3个字节的两个地址是同一整数的一部分,因此地址之间的差异为0 * sizeof(int)
。如果您选择ptr1 = arr + 1;
,或者可能不是,则可能会找到不同的答案。但这就是未定义行为的美妙 - 无论如何都是'正确的'。
答案 1 :(得分:4)
减法后,您需要将结果除以指向类型的大小。
(int*)ptr2 - (int*)ptr1 == (0x1000003 - 0x1000000) / sizeof(int)
(int*)ptr2 - (int*)ptr1 == (0x1000003 - 0x1000000) / 4 == 0
答案 2 :(得分:1)
ptr1
和ptr2
都是char *
类型,这意味着一个字节一个指针。
char *ptr2 = ptr1 + 3;
所以
ptr2 - ptr1 = 3
接下来,您将两个指针都转换为类型int *
,int
类型需要4个字节,因此两个指针都指向相同的int
,两个指针都通过内存对齐具有相同的值,你得到0
结果。
答案 3 :(得分:0)
当你减去两个指针时,只要它们指向同一个数组,结果就是分隔它们的元素数量。
答案 4 :(得分:0)
同一阵列的元素的内存地址始终是顺序的。即 如果myarray [0]的记忆地址是:
0x4000000
那么myarray [2]的内存地址肯定是
0x4000002
因此,当您将arr
的地址存储到ptr1
时,假设它是 x
,然后当你设置ptr2
的地址时,三个单位高于而不是ptr1,它将是 x + 3 。所以当你从ptr2中减去ptr1时,答案就是:
( x +3) - x = 3
因此答案。
在第二个 printf()语句中,如果希望它显示与上面相同的结果(3),则必须将指针转换为int
而不是{{1 }}。
int*
所以在你的情况下:
char *myvar; // given contents somewhere
int addr = (int)myvar; // addr now = the char pointer