我正在学习 C,并开始探索指针和指针运算的世界。例如,在以下代码片段中:
int nums[] = {1, 2, 3};
nums
是一个数组变量,其作用类似于指向数组第一个内存位置的指针。我编写了以下示例代码,并试图理解为什么我得到了我得到的结果:
#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;
}
我发现 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
看起来 nums
和 nums + 1
偏移了 4 个字节;但是,&nums
和 &nums + 1
偏移了 12。为什么这个偏移是 12 字节而不是 4?
最佳答案
混淆与 C 语言中数组如何在某些上下文中隐式退化为指针有关。
更容易解释的是,nums + 1
实际上意味着 &nums[0] + 1
。 nums[0]
是 int
类型,每个元素 4 个字节。因此 &nums[0] + 1
是 &nums
之后的 4 个字节。
对于&nums + 1
,&nums
是int(*)[3]
类型,每个元素12字节。因此 &nums + 1
是 &nums
之后的 12 个字节。
关于c - C 中使用数组变量的指针运算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32102366/