C語言 指標與陣列的用法比較

2021-10-04 20:52:32 字數 1917 閱讀 7547

陣列是乙個記憶體連續的整體,指標的值是另外乙個變數的位址,兩者的操作是有區別的。陣列名可以看作乙個指標常量(但在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 個位元組,至於它指向的陣列佔多少位元組,不知道。它是 指向陣...