使用数组变量的C中的指针算法

Ada*_*Bak 4 c arrays pointers

我正在学习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是预期的那样; 然而,当我申请指针运算,并添加1nums这个结果不等于&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)

看来,numsnums + 1被关闭的4个字节设置; 然而,&nums&nums + 1由12偏移为什么说该偏移是由12个字节,而不是由4?

Nay*_*uki 7

混淆与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.