zoukankan      html  css  js  c++  java
  • 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
    "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
    ", fArray[i]);  
    29     }  
    30       
    31     printf("%p, %p, %p
    ", &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
    ", lookup_keyword("return", keyword, DIM(keyword)));  
    39     printf("%d
    ", lookup_keyword("main", keyword, DIM(keyword)));  
    40   
    41     return 0;  
    42 }  

    const char* table[]作参数实际会退化为const char** table

    8、小结

                数组的类型由元素类型和数组大小共同决定 

                数组指针是—个指针,指向对应类型的数组 

                指针数组是—个数组,其中每个元素都为指针 

                数组指针遵循指针运算法则 

                指针数组拥有C语言数组的各种特性

  • 相关阅读:
    085 Maximal Rectangle 最大矩形
    084 Largest Rectangle in Histogram 柱状图中最大的矩形
    083 Remove Duplicates from Sorted List 有序链表中删除重复的结点
    082 Remove Duplicates from Sorted List II 有序的链表删除重复的结点 II
    081 Search in Rotated Sorted Array II 搜索旋转排序数组 ||
    080 Remove Duplicates from Sorted Array II 从排序阵列中删除重复 II
    079 Word Search 单词搜索
    078 Subsets 子集
    bzoj2326: [HNOI2011]数学作业
    bzoj2152: 聪聪可可
  • 原文地址:https://www.cnblogs.com/lemaden/p/10128186.html
Copyright © 2011-2022 走看看