C語言-陣列指標與指標陣列
1、思考
下面這些宣告合法嗎?
int array[5];
int matrix[3][3];
int * pa = array;
int * pm = matrix;
問題:
array代表陣列首元素的地址,那麼matrix代表什麼?
array和&array的地址值相同,但是意義不同,那麼它們所代表的型別相同嗎?
2、陣列型別
C語言中的陣列有自己特定的型別
陣列的型別由元素型別和陣列大小共同決定
例: int array[5]的型別為int[5]
3、定義陣列型別
C語言中通過typedef為陣列型別重新命名
1 typedef type(name)[size];
陣列型別:
1 typedef int(AINT5)[5]; 2 typedef float(AFLOAT10)[10];
陣列定義:
1 AINT5 iArray; 2 3 AFLOAT10 fArray;
4、陣列指標
陣列指標用於指向—個數組
陣列名
通過將取地址符&作用於陣列名可以得到陣列的起始地址
可通過陣列型別定義陣列指標: ArrayType* pointer;
也可以直接定義: type(*pointer) [n];
- pointer為陣列指標變數名
- type為指向的陣列的元素型別
- n為指向的陣列的大小
5、例項分析
陣列型別和陣列指標 32-1.c
1 #include <stdio.h> 2 3 typedef int(AINT5)[5]; 4 typedef float(AFLOAT10)[10]; 5 typedef char(ACHAR9)[9]; 6 7 int main() 8 { 9 AINT5 a1; 10 float fArray[10]; 11 AFLOAT10* pf = &fArray; //陣列指標 12 ACHAR9 cArray; 1314 char(*pc)[9] = &cArray; //定義一個數組指標並用cArray陣列的地址初始化 15 char(*pcw)[4] = cArray; //warning or error 陣列首元素地址為char* 初始化char(*)[4] 16 17 int i = 0; 18 19 printf("%d, %d\n", sizeof(AINT5), sizeof(a1)); //20,20 20 21 for(i=0; i<10; i++) 22 { 23 (*pf)[i] = i; 24 } 25 26 for(i=0; i<10; i++) 27 { 28 printf("%f\n", fArray[i]); 29 } 30 31 printf("%p, %p, %p\n", &cArray, pc+1, pcw+1); //(unsigned int)pc + 1*9 32 33 return 0; 34 }
陣列首元素的地址為int* 型別,而陣列的地址為int(*)[5]型別
pc+1=(unsigned int)pc+sizeof(*pc)=0xbfdce3ac
pcw+1=(unsigned int)pcw+sizeof(*pcw)=0xbfdce3a7
6、指標陣列
指標陣列是—個普通的陣列
指標陣列中每個元素為—個指標
指標陣列的定義: type* pArray[n];
- type它為陣列中每個元素的型別
- pArray為陣列名
- n為陣列大小
7、例項分析
指標陣列的應用 32-2.c
1 #include <stdio.h> 2 #include <string.h> 3 4 #define DIM(a) (sizeof(a)/sizeof(*a)) 5 6 int lookup_keyword(const char* key, const char* table[], const int size) 7 { 8 int ret = -1; 9 10 int i = 0; 11 12 for(i=0; i<size; i++) 13 { 14 if( strcmp(key, table[i]) == 0 ) 15 { 16 ret = i; 17 break; 18 } 19 } 20 21 return ret; 22 } 23 24 int main() 25 { 26 const char* keyword[] = { 27 "do", 28 "for", 29 "if", 30 "register", 31 "return", 32 "switch", 33 "while", 34 "case", 35 "static" 36 }; 37 38 printf("%d\n", lookup_keyword("return", keyword, DIM(keyword))); 39 printf("%d\n", lookup_keyword("main", keyword, DIM(keyword))); 40 41 return 0; 42 }
const char* table[]作引數實際會退化為const char** table
8、小結
陣列的型別由元素型別和陣列大小共同決定
陣列指標是—個指標,指向對應型別的陣列
指標陣列是—個陣列,其中每個元素都為指標
陣列指標遵循指標運演算法則
指標陣列擁有C語言陣列的各種特性