数组名和指针
数组名用于记录数组的起始地址,数组名是一个指针。但它与普通指针又有不同,其值不能更改,即数组名不可以被赋为其他值,只能存储数组的起始地址,由此表明数组名是一个指针常量。
数组名是一个指针常量,它具有指针常量的所有特性,但又具备一些特殊的属性,不能像操作其他指针常量一样操作数组名,有些操作对数组名来说是不合理或非法的,具体如下:
1、数组与数组不能进行比较操作,示例代码如下:
int arr1[3] = {1,2,3};
int arr2[3] = {4,5,6};
if(arr1 < arr2){…} //不合理操作
上述代码定义了两个int类型的数组,使用if条件结构语句对两个数组名进行比较操作,虽然该比较操作不会报错,但这样的操作却不合理,数组名记录的是数组起始地址,两个数组地址比较没有任何意义。
2、数组与数组不能进行算术运行,示例代码如下:
int arr1[5] = {5,6,7,8,9};
int arr2[5] = {2,3,4,5,6};
arr1+=arr2; //错误操作
上述代码中,两个数组名相加就是两个地址相加,是非法的。
3、使用sizeof运算符计算数组名,无法获取数组名(指针常量)的大小
使用sizeof运算符计算数组名,会得到整个数组所占内存空间的大小,而不是数组名这个指针常量所占的内存空间。示例代码如下:
int arr[5];
printf("%d\n", sizeof(arr)); //结果为20,不是4
4、对数组名执行取地址运算,结果为数组首地址
数组名是一个特殊的指针,对其执行取地址运算,结果还是数组的起始地址。示例代码如下:
int arr[6];
printf("%p\n", arr); //数组起始地址
printf("%p\n", &arr); //数组起始地址
上述代码运行后得到同一个地址,即数组起始地址。二维数组名与一维数组名相同,也是一个指针常量,只是二维数组名是一个二级指针常量,对二维数组名执行上述操作得到二维数组起始地址。