Linux C 指標和陣列

2021-10-13 07:52:07 字數 2658 閱讀 9729

目錄

1. 為什麼需要陣列?

2. 深刻理解陣列

3. 一維陣列中幾個關鍵符號的理解

4. 陣列的訪問方式

5. 指標變數資料型別的強制轉換

6. 指標,陣列和sizeof

7. 陣列的傳參

8. 指標陣列和陣列指標

9. 二維陣列

原因顯而易見,比如要錄入100個學生的成績,如果沒有陣列就必須定義100個變數,就很麻煩,為此c語言引入了陣列。也可以參考這個例子,計算使用者輸入的數字的平均數,並輸出所有大於平均數的數。

編譯器角度來說,陣列也是乙個變數,和普通變數沒有什麼本質區別。變數的本質指的就是一段記憶體空間,編譯器在編譯的時候,會將乙個變數名和這段記憶體空間的第乙個位元組位址繫結,變數的型別(變數資料型別的作用就是說明儲存空間大小和資料儲存結構)決定了這段記憶體空間的位元組數。訪問的時候有兩種方法,一是利用變數名訪問,而是直接使用位址訪問

記憶體角度,陣列的記憶體空間是連續的,所以使用指標進行操作非常方便。實際上陣列就是搞高效利用指標的典型例子。

int buf[100] = ;

buf和&buf的值相等,但是含義完全不同。buf表示陣列第乙個元素的首位元組位址,加1加的是乙個元素空間的大小。&buf表示的是陣列首位址,加1加的是整個陣列空間大小,陣列首位址主要用於構建多維陣列,對於一維陣列而言,沒有太大意義。

int buf[6] = ;

int i = 0;

for(i = 0; i < sizeof(buf)/sizeof(buf[0]); i++)

int i = 0;

for(i = 0; i < sizeof(buf)/sizeof(buf[0]); i++)

int i = 0;

itn *p = buf;

for(i = 0; i < sizeof(buf)/sizeof(buf[0]); i++)

對於指標來說,和普通變數的強制型別轉換不同,一律要求顯式強制型別轉換。

int a;

float b = 136.23;

int *pa = &a;

int *pb = &b;

*pa = (int)*pb;//等價於a=(int)b

int a;

int *pa = &a;

float *pb = null;

pb = (float *)pa;

pa和pb裡面的位址值是相等的,但是pa存放的是(int *),而pb放的是(float *)。雖然他們都指向同乙個空間,不同的是,當使用*pa去使用變數空間a的時候,會以float型的空間大小和資料儲存結構使用a空間的值。 

char str = "hello";

*************************=

sizeof(str) 6

strlen(str) 5

strlen(str[0]) 1

char str = "hello";

char *p = str;

********************=

sizeof(p) 4

strlen(p) 5

sizeof(*p) 1

對於陣列來說,傳參傳遞的都是陣列的首元素首位元組位址,目的是提高陣列的傳參效率。為什麼c語言中,接收的陣列形參允許int buf[100]來定義,原因是為了增加**的可讀性。因為傳遞陣列本質上傳遞的是位址,如果形參直接寫成指標變數的形式,就無法區別傳遞的到底是陣列還是乙個普通變數的位址。

void fun(int buf[100])//等價於int buf和int *buf

int main(void)

正常情況下,傳遞陣列時,為了操作整個陣列空間,還要將陣列的元素個數傳遞過去。

指標陣列實質上是乙個陣列,只是陣列中的元素是指標變數,因而叫指標陣列。陣列指標實質是乙個指標,因為這個指標指向的是乙個陣列,所以叫陣列指標。

分析表示式:第一步找核心,第二步找結合。

int *p[5]    //指標陣列

int (*p)[5] //陣列指標

int *(p[5]) //指標陣列

陣列名代表陣列元素的首位址。對一維陣列而言,一維陣列名是乙個一級指標。對於二維陣列而言,二維陣列名是乙個二級指標。

陣列指標訪問二維陣列

a[i][j]等同於*(*(p+i)+j)

p不解引用,對p加減是在第一維里偏移位址

p解一次引用,對*p加減是在第二維里偏移位址

p解兩次引用,才能訪問到值

指標陣列和陣列指標

有關陣列指標和指標陣列容易混淆,本文舉例說明兩者的區別,並加以分析。基本概念 指標 inta 1 int p a 指標的指標 int p2p p 簡單陣列 intb 20 指標陣列 int p 10 指標陣列,含有10個指標元素,即每乙個元素都是乙個指標 陣列指標 int p 10 這個指標用來指向...

指標陣列和陣列指標

理解這兩個概念,當從語言學的語法角度開始,定語 名詞,即 的 語句。指標陣列 指標的陣列 陣列指標 陣列的指標。一 指標陣列 元素為指標的陣列 顧名思義,就是說的首先是乙個陣列吧,然後陣列的元素是指標而已。說明形式為 type pointer array constant1 constant2 co...

指標陣列和陣列指標

該文時自己對指標陣列用法的一點總結,還望高手指點不足原文如下 由於以前對指標陣列不太明白,所以自己寫了 乙個小的測試程式來驗證了自己的猜測,先總結如下 指標陣列,由名字就可以知道的該陣列中的成員都是為指標的。其定義的方法為 char p 5 該初定義乙個包含5個char 型別的陣列的指標,由於p本身...