陣列與指標

2021-07-25 04:36:48 字數 2906 閱讀 7063



c++/c 程式中,指標和陣列在不少地方可以相互替換著用,讓人產生一種錯覺,以為兩者是等價的。

陣列要麼在靜態儲存區被建立(如全域性陣列),要麼在棧上被建立。陣列名對應著(而不是指向)一塊記憶體,其位址與容量在生命期內保持不變,只有陣列的內容可以改變。

指標可以隨時指向任意型別的記憶體塊,它的特徵是「可變」,所以我們常用指標來操作動態記憶體。指標遠比陣列靈活,但也更危險。

下面以字串為例比較指標與陣列的特性。

修改內容

示例中,字元陣列a 的容量是6 個字元,其內容為hello\0。a 的內容可以改變,如a[0]= 『x』。指標p 指向常量字串「world」(位於靜態儲存區,內容為world\0),常量字串的內容是不可以被修改的。從語法上看,編譯器並不覺得語句p[0]= 『x』有什麼不妥,但是該語句企圖修改常量字串的內容而導致執行錯誤。

[html]view plain

copy

print?

char a = 「hello」;  

a[0] = 『x』;  

cout <

<

a<

<

endl;  

char *p = 「world」; // 注意p 指向常量字串  

p[0] = 『x』; // 編譯器不能發現該錯誤  

cout <

<

p<

<

endl;  

char a = 「hello」;

a[0] = 『x』;

cout << a << endl;

char *p = 「world」; // 注意p 指向常量字串

p[0] = 『x』; // 編譯器不能發現該錯誤

cout << p << endl;

內容複製與比較

不能對陣列名進行直接複製與比較。示例中,若想把陣列a 的內容複製給陣列b,不能用語句 b = a ,否則將產生編譯錯誤。應該用標準庫函式strcpy 進行複製。

同理,比較b 和a 的內容是否相同,不能用if(b==a) 來判斷,應該用標準庫函式strcmp進行比較。

語句 p = a 並不能把a 的內容複製指標p,而是把a 的位址賦給了p。要想複製a的內容,可以先用庫函式malloc 為p 申請一塊容量為strlen(a)+1 個字元的記憶體,再用strcpy 進行字串複製。同理,語句if(p==a) 比較的不是內容而是位址,應該用庫函式strcmp 來比較

[html]view plain

copy

print?

// 陣列…  

char a = "hello";  

char b[10];  

strcpy(b, a); // 不能用 b = a;  

if(strcmp(b, a) == 0) // 不能用 if (b == a)  

…  // 指標…  

int len = strlen(a);  

char *p = (char *)malloc(sizeof(char)*(len+1));  

strcpy(p,a); // 不要用 p = a;  

if(strcmp(p, a) == 0) // 不要用 if (p == a)  

// 陣列…

char a = "hello";

char b[10];

strcpy(b, a); // 不能用 b = a;

if(strcmp(b, a) == 0) // 不能用 if (b == a)

…// 指標…

int len = strlen(a);

char *p = (char *)malloc(sizeof(char)*(len+1));

strcpy(p,a); // 不要用 p = a;

if(strcmp(p, a) == 0) // 不要用 if (p == a)

計算記憶體容量

用運算子sizeof 可以計算出陣列的容量(位元組數)。示例7-3-3(a)中,sizeof(a)的值是12(注意別忘了』\0』)。指標p 指向a,但是sizeof(p)的值卻是4。這是因為sizeof(p)得到的是乙個指標變數的位元組數,相當於sizeof(char*),而不是p 所指的記憶體容量。c++/c 語言沒有辦法知道指標所指的記憶體容量,除非在申請記憶體時記住它。

注意當陣列作為函式的引數進行傳遞時,該陣列自動退化為同型別的指標。示例中,不論陣列a 的容量是多少,sizeof(a)始終等於sizeof(char *)。

[html]view plain

copy

print?

char a = "hello world";  

char *p = a;  

cout<

<

sizeof(a) <

<

endl; // 12 位元組  

cout<

<

sizeof(p) <

<

endl; // 4 位元組  

示例 計算陣列和指標的記憶體容量  

void func(char a[100])    

char a = "hello world";

char *p = a;

cout<< sizeof(a) << endl; // 12 位元組

cout<< sizeof(p) << endl; // 4 位元組

示例 計算陣列和指標的記憶體容量

void func(char a[100])

[html]view plain

copy

print?

指標與陣列,指標陣列 陣列指標

int a 10 print n a p,a p a,a print n a 1 p,a 1 p a 1,a 1 a做乙個指標,步長為4,指向乙個元素,a做乙個指標,步長為40,指向乙個維陣列 int b 3 4 print n b p,b p,b p b,b,b print n b 1 p,b 1...

指標陣列與陣列指標

1.指標陣列 指標陣列中每乙個元素都是乙個指標,也既是存放字串的首位址。所以指標陣列適合處理若干個長度不等的字串。定義的一般形式為 型別說明符 指標陣列名 陣列長度 例如 int p 3 宣告乙個陣列,指標陣列p,由3個int型別指標變數元素組成 從運算子的優先順序分析,由於 的優先順序大於 所以p...

指標陣列與陣列指標

呵呵,實在是厭倦了繞口的解釋。指標陣列,故名思義,就是指標的陣列,陣列的元素是指標 陣列指標,同樣,就是直想陣列的指標。簡單舉例說明 int p 2 首先宣告了乙個陣列,陣列的元素是int型的指標。int p 2 宣告了乙個指標,指向了乙個有兩個int元素的陣列。其實這兩種寫法主要是因為運算子的優先...