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

  • 相关阅读:
    Use Module and Function instead of Class in Python
    以命令行方式使用Desktop版Ubuntu
    python中两种拷贝目录方法的比较
    查找重复文件并删除的工具
    Manage sshd Service on CentOS
    Java多线程间的数据共享
    并发 总结
    MapReduce 过程分析
    java能不能自己写一个类叫java.lang.System/String正确答案
    生产者消费者模式--阻塞队列--LOCK,Condition--线程池
  • 原文地址:https://www.cnblogs.com/lemaden/p/10128186.html
Copyright © 2011-2022 走看看