指標與陣列的比較

2021-07-12 04:21:17 字數 2278 閱讀 2775

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

為兩者是等價的。

陣列要麼在靜態儲存區被建立(如全域性陣列) ,要麼在棧上被建立。陣列名對應著(而不是指向)一塊記憶體,其位址與容量在生命期內保持不變,只有陣列的內容可以改變。指標可以隨時指向任意型別的記憶體塊,它的特徵是「可變」 ,所以我們常用指標來操作動態記憶體。指標遠比陣列靈活,但也更危險。

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

.修改內容示例1

中,字元陣列

a的容量是

6個字元,其內容為 

hello\0 。a 

的內容可以改

變,如 

a[0]=『x

』。指標

p 指向常量字串「

world 

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

world\0

) ,常量字串的內容是不可以被修改的。從語法上看,編譯器並不覺得語句 

p[0]=『x

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

示例1:

char

a ="hello"

;a[0] =

'x';

cout<

char

*p = 

"world"

; // 注意p指向常量字串

p[0] = 

'x'; 

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

cout<2.

內容複製與比較

不能對陣列名進行直接複製與比較。示例2

中,若想把陣列

a的內容複製給陣列

b ,不能用語句

b = a 

,否則將產生編譯錯誤。應該用標準庫函式

st rcpy 

進行複製。

同理,比較b和a

的內容是否相同,不能用 

i f ( b==a) 

來判斷,應該用標準庫函式

st rcmp

進行比較。語句p = a並不能把a的內容複製指標p ,而是把a的位址賦給了p 。要想複製 a數

組的內容,可以先用庫函式mal loc 為p申請一塊容量為st r l en( a) +1 個字元的記憶體,再用st

rcpy進行字串複製。同理,語句i f ( p==a) 比較的不是內容而是位址,應該用庫

函式st rcmp

來比較。

示例2:

// 陣列

char

a = 

"hello"

;char

b[10];

strcpy(b,a); 

// 不能用b = a;

if(strcmp(b, a) == 0) 

// 不能用if(b == a)

// 指標

intlen = strlen(a);

char

*p = (

char

*)malloc(

sizeof

(char

) *(len + 1));

strcpy(p,a); 

//不要用p = a;

if(strcm(p,a) == 0) 

// 不要用if(p == a)3.

計算記憶體容量

用運算子sizeof

可以計算出陣列的容量(位元組數)。示例3

中, si zeof ( a)

的值是12 

(注意別忘了』

\ 0』) 。指標p指向

a但是si zeof ( p)

的值卻是 

4  。這是因為

si zeof ( p) 

得到的是乙個指標變數的位元組數,相當於 

si zeof ( char *) 

,而不是

p 所指的記憶體容量。注意:

當陣列作為函式的引數進行傳遞時,該陣列自動退化為同型別的指標。示例3

中,不論陣列

a 的容量是多少,

sizeof(a)始終等於

sizeof ( char *)  

。示例3

:char

a = 

"hello world"

;char

*p = a;

//*p是指標變數

cout<<

sizeof

(a)cout<<

sizeof

(p)void

func(

char

a[100])

本文出自 「巖梟」 部落格,請務必保留此出處

C 指標陣列與陣列指標的比較

test1.cpp 定義控制台應用程式的入口點。最簡單的辨別方式就是看函式名前面的指標號 有沒有被括號 包含,如果被包含就是函式指標,反之則是指標函式。include stdafx.h include iostream using namespace std void main int p 5 陣列...

比較指標與陣列的特性

侵權即刪 c c 程式中,指標和陣列在不少地方可以相互替換著用,讓人產生一種錯覺,以為兩者是等價的。陣列要麼在靜態儲存區被建立 如全域性陣列 要麼在棧上被建立。陣列名對應著 而不是指向 一塊記憶體,其位址與容量在生命期內保持不變,只有陣列的內容可以改變。指標可以隨時指向任意型別的記憶體塊,它的特徵是...

陣列的內涵(與指標比較)

以下內容 以64位系統為例 1 陣列名的內涵在於其指代實體是一種資料結構,這種資料結構就是陣列 2 陣列名的外延在於其可以轉換為指向其指代實體的指標,而且是乙個指標常量 3 指向陣列的指標則是另外一種變數型別 在win32平台下,長度為4 僅僅意味著陣列的存放位址!1 陣列名作為函式形參時,在函式體...