1、数组名含义
在C语言程序中,数组的出现有两种可能的含义:
(1)代表整个数组
(2)代表其首元素的地址
当出现以下情形时,数组代表的是整个数组:
(1)在数组定义中 int arr[5]
int arr[5]; //此时arr代表整个数组
(2)在 sizeof 运算表达式中
int len=sizeof(arr); // 此时arr代表整个数组
(3)在取址符&中 &arr
printf("%p",&arr); //此时arr代表整个数组
当出现其他情形时,数组代表其首元素地址。
2、数组下标运算符[]
在此之前先了解 “&” 取地址符号和 “ * ” 解引用符号:
(1) “ & ” 取地址符号,如果后面跟的是变量,代表获取该变量所在内存空间的地址(int a; &a),如果后面跟的是数组的名字(int arr[5];&arr),代表整个数组范围:
(2) “ * ” 解引用符号,就是取地址里面的数据
int arr[5]= {1,2,3,4,5};
arr+1 代表2的地址,此时*(arr+1)代表解引用,由于 arr+1 在数组中已经是最小的地址范围了,不能再缩小了,所以直接取地址里面的数据,也就是说*(arr+1)就是获取到数据2 。
数组下标实际上是编译系统的一种简写,其等价形式是:
a[i]= 1; 等价于 *(a+i)= 1;
a[i] <== > *(a+i)
// &变量 读取一个元素的地址// *地址 从这个地址开始读取元素的值
根据加法交换律,以下的所有的语句均是等价的:
a[i]= 100;
*(a+i)= 100;
*(i+a)= 100;
i[a]= 100;
// &arr[i] == arr+i
// &arr[i] == arr+i 是读取arr[i]这个元素的 起始地址
// *(&arr[i]) == *(arr+1) 是从这个地址读取元素的值
3、万能公式:
*(标识符+偏移量) <==> 标识符[偏移量]
例如:
*(arr+1) <==> arr[1]