第32课 数组指针和指针数组分析
1. 数组的类型
(1)C语言中的数组有自己特定的类型
(2)数组的类型由元素类型和数组大小共同决定。(如int array[5]类型为int[5])
2. 定义数组类型
(1)C语言中通过typedef为数组类型重命名:
-
- typedef type(name)[size];
①数组类型:如typedef int (AINT5)[5]; typedef float (AFLOAT10)[10];
②数组定义:AINT5 iArray; AFLOAT10 fArray;
3. 数组指针
(1)数组指针用于指向一个数组
(2)数组名是数组首元素的起始地址,但并不是数组的起始地址。
(3)通过将&作用于数组名可以得到数组的起始地址
(4)定义数组指针的两种方式:
①可通过数组类型定义数组指针:ArrayType* pointer;
②可以直接定义:type (*pointer)[n]; //其中pointer为数组指针变量名,type为数组的元素类型,n为数组的大小
【实例分析】数组类型与数组指针
1 #include <stdio.h> 2 3 4 5 typedef int (AINT5)[5]; //数组类型:int[5] 6 7 typedef float (AFLOAT10)[10]; //数组类型:float[10] 8 9 typedef char (ACHAR9)[9]; //数组类型:char[9] 10 11 12 13 int main(){ 14 15 16 17 AINT5 a1; //定义变量a1为int[5]类型的数组 18 19 float fArray[10];//普通定义数组的方法 20 21 AFLOAT10* pf = &fArray;//合法。&表示取的是整个数组地址(相当于 22 23 //float[10]类型的数组指针。 24 25 ACHAR9 cArray; 26 27 28 29 char(*pc)[9] = &cArray;//定义pc指针,并指向cArray数组。类型一致,合法。 30 31 //char(*pcw)[4] = cArray;//错误,数组名cArray为首元素的地址(相当于char*)与pcw指针类型不匹配 32 33 char(*pcw)[4] = (char(*)[4])cArray; 34 35 36 37 int i = 0; 38 39 40 41 printf("%d, %d\n", sizeof(AINT5),sizeof(a1));//4*5=20 42 43 44 45 for(i=0; i<10; i++) 46 47 { 48 49 (*pf)[i] = (float)i; //pf指向整个数组,即相当于&a。而*pf等价于(*&a),即相当于a 50 51 //即*pf等价于数组名fArray,所以表达式相当于fArray[i] = (float)i; 52 53 } 54 55 56 57 printf("pf = %X, pf + 1 = %X\n", pf, pf+1); //pf + 1,指向数组最后一个元素的后面 58 59 60 61 for(i=0; i<10; i++) 62 63 { 64 65 printf("%f\n",fArray[i]);//打印0到9 66 67 } 68 69 70 71 printf("%p, %p ,%p\n", &cArray, pc+1, pcw+1);//pc+1==>(unsigned int)pc + 1*sizeof(*pc) 72 73 // ==>(unsigned int)pc + 1*9 74 75 //同理pcw + 1 = pcw + 4 76 77 78 79 return 0; 80 81 }
4. 指针数组
(1)指针数组是一个普通的数组,其中的每个元素为一个指针
(2)指针数组的定义:type* pArray[n]; //其中的type*为数组中元素的类型,pArray为数组名,n为数组的大小(如float* a[3])
【实例分析】指针数组的应用
1 #include <stdio.h> 2 3 #include <string.h> 4 5 6 7 //sizeof(a)表示整个元素的大小 8 9 //a表示首元素地址,*a即取出第1个元素 10 11 #define DIM(a) (sizeof(a)/sizeof(*a)) 12 13 14 15 //table指向一个指针数组,即每个元素为指针类型 16 17 int lookup_keyword(const char* key, const char* table[], const int size) 18 19 { 20 21 int ret = -1; 22 23 24 25 int i = 0; 26 27 28 29 for(i=0; i<size; i++) 30 31 { 32 33 if(strcmp(key, table[i]) == 0) 34 35 { 36 37 ret = i; 38 39 break; 40 41 } 42 43 } 44 45 46 47 return ret; 48 49 } 50 51 52 53 int main() 54 55 { 56 57 58 59 const char* keyword[]={ 60 61 "do", 62 63 "for", 64 65 "if", 66 67 "register", 68 69 "return", 70 71 "switch", 72 73 "while", 74 75 "case", 76 77 "static" 78 79 }; 80 81 82 83 printf("%d\n", lookup_keyword("return",keyword,DIM(keyword)));//4 84 85 printf("%d\n", lookup_keyword("main",keyword,DIM(keyword))); //-1 86 87 88 89 return 0; 90 91 }
5. 小结
(1)数组的类型由元素类型和数组大小共同决定
(2)数组指针是一个指针,指向对应类型的数组。
(3)指针数组是一个数组,其中每个元素都为指针
(4)数组指针遵循指针运算法则
(5)指针数组拥有C语言数组的各种特性