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

 

posted @ 2018-12-16 21:30  lemaden  阅读(278)  评论(0编辑  收藏  举报