关于int*[1]与int(*)[1]的区别及赋值报错的技术咨询
int*[1]和int(*)[1]的区别,以及为啥有些赋值不合法 咱们先从最核心的类型区别说起,C++的类型声明优先级很容易绕晕,拆解一下就清楚了:
一、两个类型的本质差异
int*[1]:这是个指针数组
翻译成人话就是:一个大小为1的数组,数组里装的是「指向int的指针」。所以T1 t1;声明的t1,就是个只有1个元素的数组,这个元素是int*类型。int(*)[1]:这是个指向数组的指针
这里的括号改变了优先级,意思是:一个指针,它指向的是「大小为1的int数组」。所以T2 t2;声明的t2,是个指针,它的目标必须是int[1]类型的数组。
举个更直观的类比:就像int* arr[5]是存5个int指针的数组,int (*p)[5]是指向5个int的数组的指针,这里只是把数组大小改成了1,本质逻辑完全一样。
二、逐个分析赋值的合法性
咱们对着你的代码一条条看:
t1[0] = 0; // 合法t1是指针数组,t1[0]取的是数组里的第一个元素——也就是个int*指针。给指针赋值0(空指针)是完全没问题的,指针本来就可以存地址或者空值嘛。t2[0] = 0; // 错误:数组类型'int [1]'不可赋值t2是指向int[1]数组的指针,t2[0]等价于*(t2),也就是解引用这个指针,得到的是它指向的那个int[1]数组。而C++里有个硬规则:数组类型不能被直接赋值——你不能把一个值直接丢给整个数组,就像你不能写int arr[1]; arr = 0;一样,语法不允许。如果要改数组里的内容,得写成t2[0][0] = 0;,这样取的是数组里的那个int元素,赋值就合法了。t2 = t1;和t2 = &t1; // 错误
t1是int*[1]类型的数组,和t2指向的int[1]数组类型完全不搭,类型不匹配肯定不能赋值。&t1是指向int*[1]数组的指针,类型是int*(*)[1],和t2的int(*)[1]也不是一回事,自然也不能赋值。
t2 = 0; // 合法t2是指针类型,给指针赋值0(空指针)是合法操作,所有指针都可以这么干。int n[1]; t2 = &n; // 合法&n的类型就是int(*)[1],和t2的类型完全一致,类型匹配了,赋值当然合法。
最后再划个重点
int*[1]是「装指针的数组」,int(*)[1]是「指向数组的指针」,俩者是完全不同的类型,别搞混。- 数组不能被直接赋值是C++的语法规则,想改数组内容就得操作单个元素,不能直接给整个数组赋值。
内容的提问来源于stack exchange,提问作者szxwpmj

