C++二维数组a[m][n]为何可以int (*p)[n]=\u0026a[i],而不能p=a[i]赋值(0\u003c=i\u003cm)?
都没回答到点子上啊。C/C++中支持一个implicit conversion (隐性转换),叫做array to pointer conversion. 以下代码完全没问题。因为a,作为一个数组,会隐性转换为指针。An lvalue or rvalue of type “array of N T” or “array of unknown bound of T” can be converted to a prvalue of type “pointer to T”. The result is a pointer to the first element of the array.int a;int *b = a; //相当于int *b=\u0026amp;a;以上很容易理解。然后你会发现,//以下相等std::cout \u0026lt;\u0026lt; a \u0026lt;\u0026lt; " " \u0026lt;\u0026lt; \u0026amp;a \u0026lt;\u0026lt; " " \u0026lt;\u0026lt; \u0026amp;a;但意义不同的哦。1. a在上面被自动转化为指针,意义上等同于\u0026amp;a;2. \u0026amp;a意义上不等同于\u0026amp;a哦,\u0026amp;a其实是int *,就是整数指针,而\u0026amp;a其实是int (*),是数组指针!3. 不解释然后我们来看楼主的问题。int a;a是什么类型呢?a的类型是int ,就是a的类型是维度为n的数组。\u0026amp;a是什么类型呢?是 指针,指向维度为n 的数组。int (*p) = \u0026amp;a; //ok,因为类型完全一样int (*p) = a; //类型不一样哦,不行,不行不行你说不是可以隐性转换么?是的,可以。a的类型是维度为n的int 数组。隐性转换成什么呢?隐性转换成 int *,指向a的首地址。int *p = a; //ok,隐性转换了。a隐性转换为\u0026amp;a, 所以a, \u0026amp;a的值确实是相等的,但是类型不同。
■网友
p是指向数组的指针,a是数组,这种赋值就像把double赋给double*一样。
■网友
——为何可以int (*p)=\u0026amp;a,而不能p=a赋值(0\u0026lt;=i\u0026lt;m)?
p是什么?p首先是一个指针,存放了一个包含n个整型数据的数组(姑且叫他数组甲)的地址,这个时候我们可以认为数组甲,是一个有很多个类似于数组甲这样的元素构成的数组(我叫他数组乙,很显然,乙是个二维数组,数组的数组)的首元素,数组甲的地址就是数组乙的首元素的地址,所以p就可以当作数组乙的名字来赋值(二维数组名,也就是a)。
现在a是二维数组,先把a降维,看成是有m个元素组成的一维数组。那么a是什么?是a这个现在被我暂时看成一维的数组的首元素。对首元素取地址,就是数组名。所以a==\u0026amp;a。以此类推,a+i==\u0026amp;a。那么a又是什么?是对a取星以后的a的首元素,也就是数组名,所以a==\u0026amp;a,所以**a==a==*(*(a+i)+j),只不过这里ij都是0。
所以,p这么一个指向数组的指针,可以赋给它a的地址(a的首元素地址,也就是a),p=a=\u0026amp;a,以此类推,p+i=\u0026amp;a。所以你的p=a不对,a是降维之后a的第i个元素同时又是个一维数组名,表示a地址,只能赋给一个指向整型数据的指针。而你的p是个指向数组的指针,赋值符号左右端类型不同,这上哪能赋值?
你后面这p=\u0026amp;a语法上是不错,但是是强制让p指针下移i个位置了,因为p+i=\u0026amp;a(假设你已经赋值p=\u0026amp;a),你这个不就相当于p=p+i,也就相当于p+=i。也不是个特别好的写法。
另外,如果你再定义一个int *q; 然后q=a。这是可以的,a可以降维也可以不降维直接用。这时q=\u0026amp;a
——在一维数组中却只能用p=a,而不能用p=\u0026amp;a.
在一位数组里面,你就得这样定义:int *p; 这样p里面存的是一个整型变量的“坑”的坑号。而一维数组a数组名不就是他自己首元素的坑的坑号?当然可以赋值p=a。
【C++二维数组a[m][n]为何可以int (*p)[n]=\u0026a[i],而不能p=a[i]赋值(0\u003c=i\u003cm)?】
推荐阅读
- 非计算机专业想要利用课余时间深入自学C++,想要找到比较体面的工作大概需要啥水平
- C语言 指针引用数组的地址问题
- Java工程师和C++工程师在工作上有啥区别哪个更适合自身发展
- 手绘二维码可以被扫描出来吗
- C、C++、java等编程语言都有哪些坑
- c++写http服务器不用cgi和apache该用啥
- 看完c++ primer plus 还有必要再买本c++ primer看吗?
- 咋拒绝在地铁上以创业为由让扫二维码的人
- 有人可以把C,C++,Python等编程语言开发出来,而我们却难以精通,这说明了啥问题
- C语言多维数组声明调用和c为啥差别这么大
