c 中指標和陣列的區別

2021-08-30 14:31:24 字數 2887 閱讀 4621

c++/c

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

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

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

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

7.3.1修改內容

示例7-3-1

中,字元陣列a

的容量是6

個字元,其內容為hello\0

。a的內容可以改變,如a[0]= 『x』

。指標p

指向常量字串「world

」(位於靜態儲存區,內容為world\0

),常量字串的內容是不可以被修改的。從語法上看,編譯器並不覺得語句p[0]= 『x』

有什麼不妥,但是該語句企圖修改常量字串的內容而導致執行錯誤。

char a =

「hello」;

a[0] = 『x

』;cout << a << endl;

char *p =

「world

」;     // 注意p指向常量字串不可被修改

p[0] = 『x

』;             // 編譯器不能發現該錯誤

cout << p << endl;//zbf:用vc執行過

7.3.2內容複製與比較

不能對陣列名進行直接複製與比較。示例7-3-2中,若想把陣列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來比較。

// 陣列…

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) …

7.3.3計算記憶體容量

用運算子sizeof可以計算出陣列的容量(位元組數)。示例7-3-3(a)中,sizeof(a)的值是12(注意別忘了』

\0』)。指標p指向a,但是sizeof(p)的值卻是4。這是因為sizeof(p)得到的是乙個指標變數的位元組數,相當於sizeof(char*),而不是p所指的記憶體容量。c++/c語言沒有辦法知道指標所指的記憶體容量,除非在申請記憶體時記住它。

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

char a = "hello world";

char *p  = a;

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

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

void func(char a[100])

對於上述的整個程式如下:

vc6.0->file->new->source file

#include "iostream.h"

#include "stdio.h"

#include "string.h"

#include "malloc.h"

void func(char a[100]);

void main()

// 指標…

int len = strlen(aa);

char *pp = (char *)malloc(sizeof(char)*(len+1));//

先分配單元

cout<<"the length of pointer pp is ";

cout<

strcpy(pp,aa);               //

不要用p = a;

if(strcmp(pp, aa) == 0)  //

不要用if (p == a)

cout<

}void func(char a[100])

輸出結果如下:

xello

the length of a is 6

after delivered as parameter , the length of a is 4

hello

hello

the length of pointer pp is 4

hello

C語言中指標和陣列的區別

看 c專家程式設計 一書,看到陣列與指標並不相同一章,遂做了一段測試 include include int main void 輸出 可以看到這樣的輸出,結果很顯然 第乙個輸出的值,0028ff24,應該是符號表中p的位址。第二個值,00403000,是位址0028ff24中儲存的值,也就是指標p...

在C C 中,指標和陣列的區別

在c c 中,指標和陣列在很多地方可以互換使用,這使得我們產生一種錯覺,感覺陣列和指標兩者是完全等價的,事實上陣列和指標是有很大的區別的。1.兩者在含義上的區別。陣列對應著一塊記憶體區域,而指標是指向一塊記憶體區域。其位址和容量在生命期裡不會改變,只有陣列的內容可以改變 而指標卻不同,它指向的記憶體...

C語言中指標和陣列

首先,明確乙個概念,指標是什麼,一旦提到這個老生常談且富有爭議性的話題,那真是1000個人有1000種看法。在國內的很多教材中,給出的定義一般就是 指標就是位址 從初步理解指標的角度來說,這種說法是最容易理解的,但是這種說法明顯有它的缺陷所在。指標就是位址 這種說法相當於 指標 字面值位址 或者說乙...