C++学习之数组名a与&a的区别

在C++中定义一个数组:

int a[5]={1,2,3,4,5}
那么a到底代表什么含义呢?首先想到的是a代表的是数组的首元素地址。那么如果问你a的类型是什么呢?估计很多人就不太确定了,看下面程序,让编译器告诉我们a是什么类型的数据:

main.cpp如下:

技术分享

从图片中的错误提示可以看出:

a的类型是int [5]类型。那么直接将a赋值给一个int (*)[5]类型的指针类型是不行的,所以需要对a进行取地址操作&a这样得到的类型才是int(*)[5]类型(指向int [5]类型的指针类型)。

那么为什么图片中得a又可以直接赋值给一个int *类型的变量p3呢?这是因为在赋值的时候对int [5]类型进行了隐式转化,将一个int [5]类型的a转换成了int *类型的变量,说明int[5]类型和int *类型是非常相近的数据类型。而我们又知道&a[0]得到的数据类型是int *型的,所以一般会说数组名a是代表的首元素的地址,其实实质上还是有一定区别的,具体的区别是什么还不确定。

基于上述分析,a与&a其实是两种不同的数据类型,a是int [5]型(类似int *,可以理解为指向一个5元素数组首地址的指针类型),而&a是int (*) [5]型(可以理解为指向一个含5个子元素的数组整体的指针),注意区别整体与个体的区别。

所以如果我们对a和&a分别执行+1的操作,所得到的结果是不一样的。

#include <iostream>
#include <string>
#include <vector>
#include "Dog.h"

using namespace std;

int main(int argc, const char * argv[]) {
    int a[5]={0,1,2,3,4};
    cout << "a:" << a << " " << a+1 <<endl;
    cout << "&a:" << &a << " " << &a+1 <<endl;
    return 0;
}
输出的是:

技术分享

可以看到a的话+1实际上是加上一个int型的大小4字节,而&a+1加上的是整个数组的内存大小,这也体现了a和&a个体和整体的区别。这应该是由于不同的类型重载+号运算符所导致的结果,对于int [5]类型重载+号运算符与int *类似,都是加上一个int的大小,而int(*)[5]类型则是加上5个int型的大小。


郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。