c++二维数组a[m][n]中为何a的值和a[0]的值相同

C/C++ 有一个特性(其实应该算是C的特性),就是简单数据类型不包含冗余信息。简单来说,数组在内存中是顺序存储的。a和a 这两个声明,在内存里面会产生一模一样的东西。不同的就是这两个东西所代表的含义。 比如说,内存中顺序存储了20个字节的数据,然后我们要根据它的类型,声明时的数组长度,自己算出来这20字节中那一块代表了什么意思。当然为了解放人类,这一步在编译器实现了。大概像这个样子:c++二维数组a[m][n]中为何a的值和a[0]的值相同

内存中只有这么10个格子。至于哪个格子代表什么意思,都要我们自己算出来。不论是a还是a还是a的值,都根据这个含义来定。比如,我们认为:a代表了数组首地址a代表了第一个子数组的首地址(这里也可以理解为,(a)的首地址,把a看成一个长度为5的单元)a代表了第一个子数组的首地址所代表的值说的有些凌乱。。。意会把,贴个代码,可以参考一下:#include \u0026lt;iostream\u0026gt;int main(int argc, const char * argv) { // insert code here... std::cout \u0026lt;\u0026lt; "Hello, World!\"; int a; a=5; std::cout \u0026lt;\u0026lt; "a:\"; std::cout \u0026lt;\u0026lt; "a=" \u0026lt;\u0026lt; a \u0026lt;\u0026lt; std::endl; std::cout \u0026lt;\u0026lt; "a=" \u0026lt;\u0026lt; a \u0026lt;\u0026lt; std::endl; int b; b=0; std::cout \u0026lt;\u0026lt; "\size of int:" \u0026lt;\u0026lt; sizeof(int) \u0026lt;\u0026lt; std::endl; std::cout \u0026lt;\u0026lt; "b:\"; std::cout \u0026lt;\u0026lt; "b=" \u0026lt;\u0026lt; b \u0026lt;\u0026lt; std::endl; std::cout \u0026lt;\u0026lt; "b=" \u0026lt;\u0026lt; b \u0026lt;\u0026lt; std::endl; std::cout \u0026lt;\u0026lt; "b=" \u0026lt;\u0026lt; b \u0026lt;\u0026lt; std::endl; std::cout \u0026lt;\u0026lt; "b=" \u0026lt;\u0026lt; b \u0026lt;\u0026lt; std::endl; std::cout \u0026lt;\u0026lt; "b==" \u0026lt;\u0026lt; b \u0026lt;\u0026lt; std::endl; return 0;}
■网友
不相同,它们的类型都不一样怎么可能相同。另外,a绝对不是a的地址。至于为什么相同,因为a,a,a的第一个字节实际上是同一个,所以它们(转换成void*)输出的时候才会是一样的。
■网友
如楼上所说,a,a,a的第一个字节实际上是同一个,所以这三个符号代表的内存块的地址是相同的。但是,地址类型不一样,所以cout怎样解读这个地址的方式不一样,操作不一样。c++二维数组a[m][n]中为何a的值和a[0]的值相同
【c++二维数组a[m][n]中为何a的值和a[0]的值相同】
我试了一下,发现对二维数组而言,a(整个数组)的地址是void型的,毕竟它的一维元素也是地址,跟前面的char无关,所以cout直接输出它的值,如果我们将该指针强制转换成char型,那cout就会不一样的解读它然后输出字符串,跟a无异;而a,它的类型是char型指针,所以cout机智的输出了该字符串。而对于一维数组而言,a的元素就是char元素,即a就是指向char型的指针,所以cout输出了字符串;a则就是元素本身,所以cout输出了该字符。综上,地址相同容易,但输出什么还跟指针类型有关。
■网友
应为cout输出的是输出的是a和a存的值,他们实际上都是指针类型的(他们分别存的是二维数组a的首地址和一维数组a的首地址),a就是a中的第一个一维数组,所以他们的值是一样的,所以相同
■网友


推荐阅读