(1)訪問陣列元素有兩種方式:以下標的形式訪問陣列中的元素 和以指標的形式訪問陣列中的元素。
(2)下標形式vs指標形式
※※ 注意:現代編譯器的生成**優化率已大大提高,在固定增量時,下標形式的效率已經和指標形式相當,但從可讀性和**維護的角度來看,下標形式更優。
【陣列的訪問方式】
1 #include 2【陣列和指標不同】ext.c3int
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 }
129-2.cint a = ;
1 #include 23//(1)a 為陣列首元素的位址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//
段錯誤 (核心已轉儲)
(2)&a 為整個陣列的位址
(3)a 和 &a 的區別在於指標運算,前者針對的是陣列的元素,後者針對的是整個陣列
【指標運算經典問題】
1 #include 2(1)陣列作為函式引數時,編譯器將其編譯成對應的指標 // 陣列長度資訊沒有意義,都是退化為指標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 }
(2)一般情況下,當定義的函式中有陣列引數時,需要定義另乙個引數來標示陣列的大小
【虛幻的陣列引數】
1 #include 23void 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 小結 在開始之前,先思考乙個問題 陣列名可以當作常量指標使用,那麼指標是否也可以當作陣列名來使用呢?訪問陣列中的元素有兩種訪問方式,通過下標訪問和通過指標訪問陣列 下標形式和指標形式基本是等價的,但是效率略有區別 注意 現代編譯器的生成 優化率已大大提高,在...