在 C 中我了解到数组的名称是指向第一个索引的指针
事实并非如此。
根据 C 标准(6.3.2.1 左值、数组和函数指示符)
3 除非它是 sizeof 运算符的操作数或一元 &
运算符,或者是用于初始化数组的字符串文字,
具有“类型数组”类型的表达式被转换为
类型为“pointer to type”的表达式,指向初始
数组对象的元素并且不是左值。如果数组对象
有注册存储类,行为未定义。
此声明
int mat[5][4];
声明一个二维数组。因此,表达式中使用的数组指示符(除了引号中列出的极少数例外)被隐式转换为指向其第一个元素的指针,即指向 int ( * )[4] 类型的指针。
像在这个语句中那样取消引用指针
*mat=1;
您将获得int[4] 类型的数组左值。因此,您试图用标量整数值 1 分配一维数组。但数组没有赋值运算符。它们是不可修改的左值。
相反,你可以写例如
**mat = 1;
在这种情况下,表达式**mat 产生int 类型的标量左值(数组m 的第一个“行”/元素的int 类型的第一个标量元素)。
这是一个演示程序。
#include <stdio.h>
int main(void)
{
int mat[5][4];
**mat = 1;
printf( "**mat is equal to %d and equivalent to mat[0][0] that is also equal to %d\n",
**mat, mat[0][0] );
}
它的输出是
**mat is equal to 1 and equivalent to mat[0][0] that is also equal to 1
实际上所有这些表达式都在 printf 调用中使用
printf( "%d\n", **mat );
printf( "%d\n", ( *mat )[0] );
printf( "%d\n", *mat[0] );
printf( "%d\n", mat[0][0] );
产生相同的数组元素。