1. 程式人生 > >數組,引用,指針那些事

數組,引用,指針那些事

註意 首地址 編譯器 編譯 拷貝 避免 ons 現在 void

數組、指針、引用三者夾雜不清,寫法很容易讓人記憶混淆,現在做如下總結:

  • 數組的引用和引用的數組

C++中由於數組不允許拷貝和賦值,當我們函數形參設為數組時,編譯器會自動將數組形參轉換為數組首元素的指針,也就是說:

void fun(int data[10])

其實會被轉換為:

void fun( int* ptr)

其中,這個ptr指針指向數組首元素,也就是:

ptr=data

綜上,其實以下幾種數組形參的寫法其實是沒有區別的:

void fun(const int a[10]);
void fun1(const
int b[]); void fun2(const int * ptr);

這裏的const當我們不會修改時加上,如果需要修改數組元素,則去掉const。

此外,為了避免數組越界,可以顯式地傳遞一個數組長度的形參。

  • 數組和形參

函數可以傳遞指向數組首地址的指針,也可以傳遞數組的引用,寫法如下:

void fun(int (&a)[10]);
void fun2(int &a [10]);

需要註意的是,上面兩種寫法中,第一種裏,a是10個int的數組的引用,第二種裏,a是10個int的引用組成的數組。

  • 指向數組整體的指針和指向數組元素的指針

在某種具體的編譯目標平臺下,其實指針的長度是固定的,比如,32位目標平臺下,不管指針的類型是什麽,其長度都4個字節,那麽我們有如下用法時:

int a[10];
int* ptr=a;
int b=*(ptr+1);

指針如何知道要後挪4個字節,讀取a數組第二個元素的值呢? 這就是指定指針類型的作用了,這裏,我們指定了ptr是int的指針,也就告訴編譯器對這個指針操作時,每次挪動的字節數了。

也就是說,指定指針的類型,並不是為了確定指針的長度,因為它在固定編譯目標平臺下是寫死的。其實指定的是每次挪動指針時,挪動的字節數。

那麽,我們如何生成一個指向數組整體的指針?

類似於上面的數組的引用,我們用如下的方法產生一個指向整個數組的指針:

int (*ptr) [10];

括號必不可少,按照從內到外的解讀方法,首先,ptr是一個指針,其次它指向一個數組,最後,數組元素的類型是int。不過這樣要註意的是,聲明指向整個數組的指針時,我們必須指定數組的長度,只有這樣,對指針進行挪動操作時,才能確定每次挪動的字節數。

數組,引用,指針那些事