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

posted @ 2018-12-05 22:41  梦心之魂  阅读(150)  评论(0编辑  收藏  举报