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 陣列名作為函式形參時,在函式體...