第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];

那么就可以使用 AINT5AFLOAT10 定义数组,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 }

 

posted @ 2019-11-13 23:03  Hengs  阅读(268)  评论(0编辑  收藏  举报