int i = 9;
int *j = &i;
int* l = j + 1;
int **a=&j;
int **b=&l;
printf("%u\n",a);
printf("%u\n",b);
printf("%d\n",a-b);
输出:6422208 6422204 1. 1 表示什么?
答案 0 :(得分:1)
a
包含变量 j
的地址(它本身包含变量 i
的地址)
b
是 l
的地址。
然后前两个 printf
显示变量 j
和 l
被分配到的地址。
在您的示例中,j
和 l
在内存中是连续的(我假设 int
在您的架构上是 32 位)。幸运的是,它们可能彼此相距很远。
最后,当你减去最后一个 printf
中的 2 个指针时,你正在对指针进行算术运算。
增加一个指针给地址增加指向的类型的长度。例如,如果您打印变量 j
和 l
(不是它们的地址)的值,您会发现两个地址之间相差 4。
类似地,两个地址的减法等于 4
,这表示在 32 位架构的指针算法方面存在 1
的差异。这就是它打印值 1
的原因。
但是请记住,指针算法可能很棘手。关于减法,C99 标准规定:
<块引用>当两个指针相减时,都指向 相同的数组对象,或数组对象的最后一个元素之后的一个
所以在这里我认为你可以减去 a
和 b
但这不是你想要在真正的代码中做的事情。
答案 1 :(得分:0)
您的代码在很多方面都不干净,请参阅注释。使用该代码进行像您尝试进行的实验那样的实验不会给出可靠的结果。
但是,假设您使用了适当的代码来输出两个指向 int 的指针地址和两个变量 int* j; int* l;
的不同。
&j
是变量 j
的地址,可以存放在 int** a;
中,int** b=&l;
也一样。
差值 a-b
现在只是地址差值。
对于该地址差异,这行代码无关紧要。 int* l = j + 1;
,它只影响 &l
所指向的值,即不影响地址 &l
。
无法可靠地解释值 1,因为涉及到一些实现自由。但在许多情况下,此 int *j; int *l;
将导致 j
立即在内存中的“之后”l
结束,即在下一个最高地址处。由于指针运算,这导致 &j == (&l)+1
。此时,&j-&l
的值 1 很明显。