第29課 指標和陣列分析(下)

2022-02-21 10:46:32 字數 2551 閱讀 2430

(1)訪問陣列元素有兩種方式:以下標的形式訪問陣列中的元素 和以指標的形式訪問陣列中的元素。

(2)下標形式vs指標形式

※※ 注意:現代編譯器的生成**優化率已大大提高,在固定增量時,下標形式的效率已經和指標形式相當,但從可讀性和**維護的角度來看,下標形式更優。

【陣列的訪問方式】

1 #include 2

3int

main()4;

6int* p =a;

7int i = 0;8

9for(i=0; i<5; i++)

1013

14for(i=0; i<5; i++)

1518

19for(i=0; i<5; i++)

2023

24for(i=0; i<5; i++)

2528

29return0;

30 }

【陣列和指標不同】ext.c

1

int a = ;

29-2.c

1 #include 23//

extern int a;

4extern

int *a;56

intmain()714

15//

extern int a;

16//

&a = 0x601040

17//

a = 0x601040

18//

a[0] = 1

1920

21//

extern int *a;

22//

&a = 0x601040

23//

a = 0x200000001

24//

段錯誤 (核心已轉儲)

(1)a 為陣列首元素的位址

(2)&a 為整個陣列的位址

(3)a 和 &a 的區別在於指標運算,前者針對的是陣列的元素,後者針對的是整個陣列

【指標運算經典問題】

1 #include 2

3int

main()4;

6int* p1 = (int*)(&a + 1); //

指向陣列元素5的後乙個位置

7int* p2 = (int*)((int)a + 1); //

指向陣列 (起始位址 + 1位元組) 處,這裡是整數運算,不是指標運算

8int* p3 = (int*)(a + 1); //

指向第2個元素

910 printf("

%d\n

", p1[-1]); //

511 printf("

%d\n

", p2[0]); //

33554432

12 printf("

%d\n

", p3[1]); //213

14return0;

15 }

(1)陣列作為函式引數時,編譯器將其編譯成對應的指標   // 陣列長度資訊沒有意義,都是退化為指標

(2)一般情況下,當定義的函式中有陣列引數時,需要定義另乙個引數來標示陣列的大小

【虛幻的陣列引數】

1 #include 2

3void func1(char a[5]) //

char a[5] ==> char *a411

12void func2(char b) //

陣列長度有無沒有關係,char b ==> char *b

1320

21int

main();

2425

func1(array);

26 printf("

array[0] = %c\n

", array[0]); //

array[0] = a;

2728

func2(array);

29 printf("

array[0] = %c\n

", array[0]); //

array[0] = b;

3031

return0;

32 }

29 指標和陣列分析(下)

注 部落格中內容主要來自 狄泰軟體學院 部落格僅當私人筆記使用。測試環境 ubuntu 10.10 gcc版本 4.4.5 一 問題 陣列名可以當做指標常量使用,那麼指標是否也可以當做陣列名來使用呢?二 陣列的訪問方式 1 以下標的形式訪問陣列中的元素 int main a 1 3 a 2 5 re...

指標和陣列分析(上)

陣列是一段連續的記憶體空間 陣列的空間大小為sizeof arrary type arrary size 陣列名可看做指向陣列第乙個元素的常量指標 a 1的意義是什麼?結果是什麼?指標運算的意義是什麼?結果又是什麼?1 include 2 intmain 3 5int p null 6 printf...

C語言高階剖析 29 指標和陣列分析(下)

2 a 和 a 的區別 3 陣列引數 4 小結 在開始之前,先思考乙個問題 陣列名可以當作常量指標使用,那麼指標是否也可以當作陣列名來使用呢?訪問陣列中的元素有兩種訪問方式,通過下標訪問和通過指標訪問陣列 下標形式和指標形式基本是等價的,但是效率略有區別 注意 現代編譯器的生成 優化率已大大提高,在...