1. 程式人生 > >C++學習之陣列名a與&a的區別

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