标签:
在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型的大小。
标签:
原文地址:http://blog.csdn.net/softmanfly/article/details/44903261