为何在数组中 a[5] 等于 5[a]?

为何在数组中 a[5] 等于 5[a]?

技术背景

在C语言里,数组是很重要的数据结构,它让我们能高效地存储和访问多个相同类型的数据元素。在操作数组时,一般用 a[5] 这样的语法来访问数组 a 的第6个元素(数组下标从0开始)。但有趣的是,在C语言中 a[5]5[a] 是等价的,这和一般的数组访问认知不同。了解这一特性,有助于我们更深入地理解C语言中数组和指针的关系。

实现步骤

1. 理解 [] 运算符的定义

C标准把 [] 运算符定义为:a[b] == *(a + b)

2. 分析 a[5]5[a] 的计算过程

根据上述定义,a[5] 会被计算为 *(a + 5),而 5[a] 会被计算为 *(5 + a)

3. 运用加法交换律

因为加法满足交换律,即 a + 55 + a 是相等的,所以 *(a + 5)*(5 + a) 也相等,也就是 a[5] 等于 5[a]

核心代码

1
2
3
4
5
6
7
8
9
10
#include <stdio.h>

int main() {
int a[] = {1, 2, 3, 4, 5, 6};
// 输出 a[5] 的值
printf("a[5] 的值为: %d\n", a[5]);
// 输出 5[a] 的值
printf("5[a] 的值为: %d\n", 5[a]);
return 0;
}

代码解释

  • 定义了一个整型数组 a,并初始化了6个元素。
  • printf 函数分别输出 a[5]5[a] 的值。
  • 运行代码会发现,a[5]5[a] 的输出结果相同。

最佳实践

提高代码可读性

虽然 a[5]5[a] 等价,但在实际编程中,建议使用 a[5] 这种常见的写法,因为它更符合大家的编程习惯,能提高代码的可读性。

避免混淆

在复杂的表达式里,使用 5[a] 这种写法容易造成混淆,所以要谨慎使用。

常见问题

指针和数组的区别

虽然在数组访问中指针和数组有紧密联系,但它们并不完全相同。数组名是数组首元素的地址常量,而指针是变量,可以改变其指向。例如:

1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>

int main() {
int a[] = {1, 2, 3};
int *p = a;
// 合法
p++;
// 错误,数组名是常量,不能自增
// a++;
return 0;
}

负索引的使用

在C语言中,数组支持负索引,这是因为指针运算的原理。例如 a[-1] 会计算为 *(a - 1),指向数组 a 首元素的前一个位置。不过,使用负索引时要注意越界问题,避免访问非法内存。


为何在数组中 a[5] 等于 5[a]?
https://119291.xyz/posts/why-a5-equals-5a-in-arrays/
作者
ww
发布于
2025年5月26日
许可协议