数组名是地址么?它和地址的差异在哪里呢?
程序员文章站
2022-03-02 13:33:30
...
如果运算需要的话,所有的数组都存在到它元素的指针类型的右值的隐式类型转换。
说数组是本身就是地址是不科学的,而应该说数组能够自动的转化为指向他的元素的指针,这种转化是单向的,是一种退化,损失了原来数组的大小这个重要的信息。除了 sizeof 之外,其他运算符作用到数组上的时候,都要发生这种转化,即使取下标也不例外。
比如整型二维数组w[3][4],
先不要把 w 看作地址。把 w 看作三个四个元素的数组的组成的数组
sizeof(w) 不转化
sizeof(w+0) 转化
由于那么 w 是三个四个元素的数组组成的数组,那么它就可以隐式地转为指向四个元素的数组的指针.
w[0][0] = 0 两次转化
w = NULL 无法转化
说数组是本身就是地址是不科学的,而应该说数组能够自动的转化为指向他的元素的指针,这种转化是单向的,是一种退化,损失了原来数组的大小这个重要的信息。除了 sizeof 之外,其他运算符作用到数组上的时候,都要发生这种转化,即使取下标也不例外。
比如整型二维数组w[3][4],
先不要把 w 看作地址。把 w 看作三个四个元素的数组的组成的数组
sizeof(w) 不转化
sizeof(w+0) 转化
由于那么 w 是三个四个元素的数组组成的数组,那么它就可以隐式地转为指向四个元素的数组的指针.
w[0][0] = 0 两次转化
w = NULL 无法转化
#include <iostream>
using namespace std;
int main()
{
char a[3][4];
cout<<sizeof(a)<<endl;
//输出数组的大小:12
cout<<sizeof(a+0)<<endl;
//输出指针大小:4
//由于那么 a 是三个四个元素的数组组成的数组,
//那么它就可以隐式地转为指向四个元素的数组的指针
a[0][0] = 'a';//两次转化
return 0;
}
推荐阅读