1. 程式人生 > >C語言-陣列指標與指標陣列

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語言陣列的各種特性