1. 指針數組與數組指針
1.1 指針數組的定義
- 指針數組:是數組元素為指針的數組,本質為數組;
-
指針數組:每一個元素均為指針,即有諸形如“*ptr_array[i]”的指針。
注:由于數組元素均為指針,是以ptr_array[i]是指第i+1個元素的指針。
-
指針數組的定義形式為:類型名 *數組辨別符[常量表達式];
如:int *a[4];//指針數組
表示:數組a中的元素都為int型指針
元素表示:* a[i]跟* (a[i])是一樣的,因為[]優先級高于*
1.2 指針數組的應用
- 指針數組:可以作為函數的參量使用,使用方式與普通數組類似。
- 指針數組:常适用于指向若幹字元串,這樣使字元串處理更加靈活友善。
#include<iostream> using namespace std; int main() { char *p[] = {"h", "e", "l", "l", "o"}; for(int i=; i<; i++) { cout<<p[i]<<"\t"; } cout<<endl; for(int i=; i>=; i--) { int x = i+; p[i] = (char*)(&x); cout<<p[i]<<"\t"; } cout<<endl; system("pause"); return ; } =>h e l l o E D C B A
1.3 指針數組與二維數組
- 二維數組:如char string_1[10][10]隻要定義了一個二維數組,無論賦不指派,系統都會給他配置設定相應空間,而且該空間一定是連續的。其每個元素表示一個字元。我們可以通過指定下标對其元素進行修改。
- 指針數組:如char *str_B[5] 系統至少會配置設定5個連續的空間用來存儲5個元素,表示str_B是一個5個元素的數組,每個元素是一個指向字元型資料的一個指針。以下定義: 他們在記憶體的存儲方式分别如下圖所示,可見,系統給數組c配置設定了4×8的空間,而給p配置設定的空間則取決于具體字元串的長度。此外,系統配置設定給a的空間是連續的,而給n配置設定的空間則不一定連續。
注:由此可見,相比于比二維字元數組,指針數組有明顯的優點:一是指針數組中每個元素所指的字元串不必限制在相同的字元長度;二是通路指針數組中的一個元素是用指針間接進行的,效率比下标方式要高。 但是二維字元數組卻可以通過下标很友善的修改某一進制素的值,而指針數組卻無法這麼做。char c[][]={"my","name","is","Mini"};//二維數組的定義 char *p[]={"my","name","is","Mini"}; //指針數組的定義
1.4 數組指針的定義
- 數組指針:指向數組首元素的位址的指針,本質為指針,(這個指針存放的是數組首位址的位址,相當于2級指針,這個指針不可移動);
- 數組指針:存放的是數組首位址的位址,相當于2級指針,這個指針不可移動;
-
數組指針的定義形式為:類型名 (*數組辨別符)[常量表達式];
如:int (*a)[4];//數組指針
表示:指向數組a的指針
元素表示:(*a)[i];
1.5 數組指針的應用
- 代碼示例:
#include<iostream> using namespace std; int main() { char c[][] = {"h", "e", "l", "l", "o", "o"}; char (*p)[] = c; for(int i=;i<=;i++) { cout<<*(p+i)<<"\t"; } cout<<endl; for(int i=; i>=; i--) { //(*p)[i] = "X";//編譯報錯,error C2440: “=”: 無法從“const char [2]”轉換為“char” cout<<*(p+i)<<"\t"; } cout<<endl; system("pause"); return ; } =>h e l l o o o o l l e h
1.6 指針數組與數組指針的程式對比
- 代碼示例:
#include <iostream> using namespace std; int main() { int c[]={,,,}; int *a[];//指針數組 int (*b)[];//數組指針 b=&c; //将數組c中元素賦給數組a for(int i=;i<;i++) { a[i]=&c[i]; } cout<<*a[]<<endl; //輸出2就對 cout<<(*b)[]<<endl; //輸出3就對 system("pause"); return ; } =>
注:定義了數組指針,該指針指向這個數組的首位址,必須給指針指定一個位址,容易犯的錯得就是,不給b位址,直接用(*b)[i]=c[i]給數組b中元素指派,這時數組指針不知道指向哪裡,調試時可能沒錯,但運作時肯定出現問題,使用指針時要注意這個問題。但為什麼a就不用給他位址呢,a的元素是指針,實際上for循環内已經給數組a中元素指定位址了。但若在for循環内寫*a[i]=c[i],這同樣會出問題。
總之一句話,定義了指針一定要知道指針指向哪裡,不然要悲劇。
參考文獻:
[1]《C++全方位學習》範磊——第十四章
[2]《C++程式設計教程(第二版)》錢能——第三章
[3]《C++Primer(中文版)》王剛、楊巨峰——第三章
[4] 百度搜尋關鍵字:C++數組、指針數組、數組指針