陣列是乙個記憶體連續的整體,指標的值是另外乙個變數的位址,兩者的操作是有區別的。陣列名可以看作乙個指標常量(但在sizeof的情況下是不成立的)。可以檢視以下例子進行比較:
// 定義
int array[10]
;// 合法
int array[10]
=;// 合法
int*p;
// 合法,編譯通過,但是是野指標,注意賦值,否則執行時可能出錯
int*p =
null
;// 合法
// 大小(32位機器)
sizeof
(array)
;// 40
sizeof
(p);
// 4
// 轉換
int*p = array;
// 合法,陣列名array就是個位址,等價於&array[0]
int*p =
&array;
// 非法,陣列名array就是個位址
int*p = array +1;
// 合法,得到的是&array[1]
int*p =
(int*)
(&array +1)
;// 合法,偏移整個陣列,指向陣列尾部的下個單元,要小心操作
p = array;
// 合法,p是用來存放位址,陣列名就是該陣列的起始位址
array = p;
// 非法,陣列位址不可以改變
p =&array[0]
;// 合法,array[0]存放的是值不是位址,所以p是要取址
*p = array[0]
;// 合法,*p是存放值,可以直接賦值
// 賦值p[1
]=1;
// 合法,指標可以類似陣列一樣使用
array[1]
=1;// 合法,基本用法
*p =2;
// 合法,基本用法
*array =2;
// 合法,既然陣列名是位址,那麼加上*就可以裝值,等價於array[0] = 2;
// 偏移
p++;
array++
;// 非法,陣列位址不可以改變
*p++=1
;*(array++)=
1;// 非法,陣列位址不可以改變
(*p)++;
// 合法,指標指向位址的值加1
(*array)++;
// 合法,陣列名是位址,等價於array[0]++;
*(p +1)
=2;*
(array +1)
=2;// 合法,陣列名是位址,只要不修改array本身的值(位址)即可
定義字串
char str=
"hello"
;char
*p =
"hello"
;str[1]
='e';p[
1]='e'
;// 儲存在常量區(唯讀),編譯時不會報錯,執行時出錯
函式傳參
陣列和指標作為函式形參時,作用都是傳遞乙個位址,而不是拷貝乙個陣列進去,所以引數可以寫成a或*a,因為都只是傳遞乙個位址。而陣列作為形參傳遞進去之後是可以進行a++的,這個和陣列變數不一樣,另外,不能對傳進來的引數進行sizeof計算字串長度,因為傳遞進來的是乙個位址。也只有在作為函式形參時,一級指標和一維陣列是完全等價的,二級指標和二維陣列可就不一樣了。例如:
// 32位機器上執行
inttest
(char arr[
100], char
*p)
C語言指標用法總結 指標與陣列
c include intmain int i printf d n a a指向a 0 a 0 int的元素,a的型別就是 int 4,1跨度是4個位元組 printf d n a 1 printf d n a a這個位址指向整個陣列,int 5 1跨度是整個陣列的位元組長度,即20個位元組 pri...
C 指標陣列與陣列指標的比較
test1.cpp 定義控制台應用程式的入口點。最簡單的辨別方式就是看函式名前面的指標號 有沒有被括號 包含,如果被包含就是函式指標,反之則是指標函式。include stdafx.h include iostream using namespace std void main int p 5 陣列...
C語言指標陣列與陣列指標
初學者總是分不出指標陣列與陣列指標的區別。其實很好理解 指標陣列 首先它是乙個陣列,陣列的元素都是指標,陣列佔多少個位元組由陣列本身決定。它是 儲存指標的陣列 的簡稱。陣列指標 首先它是乙個指標,它指向乙個陣列。在32 位系統下永遠是佔4 個位元組,至於它指向的陣列佔多少位元組,不知道。它是 指向陣...