先看下面这段代码
为什么会出现上面的情况?按理说 &x 不应该是 x 的地址吗,不管它们的值是什么,至少它们应该是不相同的。
这里就涉及到数组转换指针的问题了。
当我们定义了一个数组变量 x 时,大家的第一反应应该都是 x 指的是数组第一个元素的地址,但是这不完全正确。
确实,当我们尝试去输出 x ,或者将 x 作为参数传递给函数,其表现出来的效果就是 x 是数组首元素的地址。但是,其实其中存在一个隐式转换(implicit conversion)的过程,即将数组类型隐式转换为指针类型。
但是,这种转换并不是任何情况下都会发生的,存在例外:
1、作为地址操作符(&)的操作数
2、作为 sizeof 的操作数
3、被字符串常量初始化了的字符数组
就是说以上三种情况下,数组类型是不会被隐式转换为指针类型的,这就能解释很多问题了。
1、为什么 x == &x
因为 &x 中的 x 没有发生类型转换,所以 x 是数组类型,&x 意为数组 x 的地址,即数组的起始地址;而 x 发生了类型转换,变成了int *,指的是数组第一个元素的地址。所以它们是相同的。
2、为什么 sizeof(x) = 8 而 sizeof(x+1) = 8
这两个8不是一个意思。sizeof(x) = 2 * sizeof (int) = 8;而sizeof(x+1) = 指针数据类型所占字节数 = 8(因为是64位下)。
利用上面的第二条结论,sizeof(x)中的 x 为数组类型,所以 sizeof() 得出的就是数组 x 所占的内存空间,为 2 * 4 = 8。而 sizeof(x+1) 中,由于先进行加法,x 被转换为 int *,所以 sizeof() 得出的就是指针数据类型的字节数,32位系统下为4,64位系统下为8。
3、为什么输出char数组可以直接输出字符串
根据第三条结论也就不难得出了。