我正在学习C,并开始探索指针和指针算术的世界.例如,在以下代码段中:
int nums[] = {1, 2, 3};
Run Code Online (Sandbox Code Playgroud)
nums是一个Array变量,其作用类似于指向数组第一个内存位置的指针.我写了下面的示例代码,并试图理解为什么我得到的结果是:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int nums[] = {1, 2, 3};
if(nums == &nums)
puts("nums == &nums");
else
puts("nums != &nums");
if((nums + 1) == (&nums + 1))
puts("(nums + 1) == (&nums + 1)");
else
puts("(nums + 1) != (&nums + 1)");
printf("nums: %i\n", nums);
printf("&nums: %i\n", &nums);
printf("nums + 1: %i\n", nums + 1);
printf("&nums + 1: %i\n", &nums + 1);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我得到的nums == &nums是预期的那样; 然而,当我申请指针运算,并添加1到nums这个结果不等于&nums + 1.换句话说(nums + 1) != (&nums + 1),尽管如此nums == &nums.
这是我得到的程序的输出:
nums == &nums
(nums + 1) != (&nums + 1)
nums: 2345600
&nums: 2345600
nums + 1: 2345604
&nums + 1: 2345612
Run Code Online (Sandbox Code Playgroud)
看来,nums和nums + 1被关闭的4个字节设置; 然而,&nums与&nums + 1由12偏移为什么说该偏移是由12个字节,而不是由4?
混淆与C中的数据有关,数组在某些上下文中隐含地衰减为指针.
更容易解释,nums + 1有效意味着&nums[0] + 1.nums[0]是type int,每个元素4个字节.这样&nums[0] + 1就是4个字节&nums.
至于&nums + 1,&nums是类型的int(*)[3],也就是每元件12个字节.这样&nums + 1就是12个字节&nums.