第32课 - 数组指针和指针数组分析
第32课 - 数组指针和指针数组分析
1. 数组的类型
C语言中的数组有自己特定的类型,数组的类型由 元素类型 和 数组大小 共同决定。比如 int array[5] 的类型就是 int[5];float farray[10] 的类型就是 float[10]。
2. 定义数组类型
C语言中通过typedef为数组类型重命名:
typedef type (name)[size];
使用这种方式重命名如下两个数组
typedef int (AINT5)[5]; typedef float (AFLOAT10)[10];
那么就可以使用 AINT5 和 AFLOAT10 定义数组,AINT5 iArray; AFLOAT10 fArray // iArray、fArray是数组名
3. 数组指针
(1)数组指针,顾名思义就是一个指针,只不过该指针用于指向一个数组
(2)前面学习数组时说过,数组名是数组首元素的地址,并不是整个数组的地址,使用&作用于数组名可以得到数组的地址
(3)定义数组指针的三种方式:
① 可以通过数组类型定义数组指针:ArrayType *pointer;
② 可以直接定义:type (*pointer)[n]; // pointer为数组指针变量名,type为数组元素的类型,n为数组的大小
③ 先使用typedef重命名数组指针类型typedef type (*POINTER)[n],然后使用该类型定义数组指针变量 POINTER pointer;
【数组类型和数组指针】
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; // int a1[5] 10 float fArray[10]; 11 AFLOAT10* pf = &fArray; 12 ACHAR9 cArray; 13 14 char(*pc)[9] = &cArray; 15 // char(*pcw)[4] = cArray; // 类型不匹配,数组名表示数组首元素的地址,对数组名&表示数组的地址 16 char(*pcw)[4] = (char(*)[4])cArray; 17 18 int i = 0; 19 20 printf("%zu, %zu\n", sizeof(AINT5), sizeof(a1)); // 20 20 21 22 for(i=0; i<10; i++) 23 { 24 (*pf)[i] = i; // fArray[i] = i; 25 } 26 27 printf("pf = %p, pf + 1 = %p\n", pf, pf+1); // float占4字节 pf = 0x7ffdb9e61e10, pf + 1 = 0x7ffdb9e61e38 28 29 for(i=0; i<10; i++) 30 { 31 printf("%f\n",fArray[i]); // 打印 0 到 9 32 } 33 34 // 0x7ffdc9e322a0, 0x7ffdc9e322a9, 0x7ffdc9e322a0 ,0x7ffdc9e322a4 35 printf("%p, %p, %p ,%p\n", &cArray, pc+1, pcw, pcw+1); // pc + 1 ==> (unsigned long)pc + 1*sizeof(*pc) ==> (unsigned long)pc + 9 36 // 同理 pcw + 1 = (unsigned long)pcw + 4 37 38 return 0; 39 }
4. 指针数组
(1)指针数组,顾名思义就是一个数组,该数组的元素类型为指针类型
(2)指针数组的定义:
type *PArray[n]
【指针数组的应用】
1 #include <stdio.h> 2 #include <string.h> 3 4 // DIM是维度(dimension)的缩写,一维数组的维度就是数组元素的个数 5 #define DIM(a) (sizeof(a)/sizeof(*a)) 6 7 //table指向一个指针数组,即每个元素为指针类型 8 int lookup_keyword(const char* key, const char* table[], const int size) // ① 数组作为形参退化为指针类型 ② 需要传入数组长度信息 9 { // char *table[] 等价于 char **table,但是后者看起来更加直观,推荐使用这种写法 10 int ret = -1; 11 int i = 0; 12 13 for(i=0; i<size; i++) { 14 if(strcmp(key, table[i]) == 0) { 15 ret = i; 16 break; 17 } 18 } 19 20 return ret; 21 } 22 23 int main() 24 { 25 const char* keyword[] = { // 这里就是一个字符指针数组 26 "do", 27 "for", 28 "if", 29 "register", 30 "return", 31 "switch", 32 "while", 33 "case", 34 "static" 35 }; 36 37 printf("%d\n", lookup_keyword("return", keyword, DIM(keyword))); // 4 38 printf("%d\n", lookup_keyword("main", keyword, DIM(keyword))); // -1 39 40 return 0; 41 }