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语言数组的各种特性