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型的大小。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值