c - C 中使用数组变量的指针运算

标签 c arrays pointers

我正在学习 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

看起来 numsnums + 1 偏移了 4 个字节;但是,&nums&nums + 1 偏移了 12。为什么这个偏移是 12 字节而不是 4?

最佳答案

混淆与 C 语言中数组如何在某些上下文中隐式退化为指针有关。

更容易解释的是,nums + 1 实际上意味着 &nums[0] + 1nums[0]int 类型,每个元素 4 个字节。因此 &nums[0] + 1&nums 之后的 4 个字节。

对于&nums + 1&numsint(*)[3]类型,每个元素12字节。因此 &nums + 1&nums 之后的 12 个字节。

关于c - C 中使用数组变量的指针运算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32102366/

相关文章:

c - RAND_MAX 是否保证 <= UINT_MAX?

c - 如何从 xml schema(xsd) 的复杂类型获取正则表达式?

c - 不透明指针 valgrind

arrays - Swift 3.0 Xcode 中是否有类似于 "If Any"的语句

c - 你如何在c中返回一个指向不可修改数据的指针

c - 制作一个 usergiven_character*usergiven_repeatsinthestring(重复次数) 的字符串

.net - 自 0001 年 1 月 1 日起,如何将日/月/年日期转换为 .NET 样式的 100ns 刻度?

c - 开关环和外壳

c - 有多少种方法可以将char数组传递给C函数?

arrays - didSelectRowAt 更改所有行中的值