• 第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
    ", 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
    ", pf, pf+1); //pf + 1,指向数组最后一个元素的后面
    58 
    59  
    60 
    61     for(i=0; i<10; i++)
    62 
    63     {
    64 
    65         printf("%f
    ",fArray[i]);//打印0到9
    66 
    67     }
    68 
    69  
    70 
    71     printf("%p, %p ,%p
    ", &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
    ", lookup_keyword("return",keyword,DIM(keyword)));//4
    84 
    85     printf("%d
    ", lookup_keyword("main",keyword,DIM(keyword))); //-1
    86 
    87  
    88 
    89     return 0;
    90 
    91

     

    5. 小结

    (1)数组的类型元素类型数组大小共同决定

    (2)数组指针是一个指针指向对应类型的数组

    (3)指针数组是一个数组,其中每个元素都为指针

    (4)数组指针遵循指针运算法则

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

  • 相关阅读:
    Codeforces 858B
    区域赛前立FLAG
    GCJ Practice Contest
    UVa 10004 Bicoloring
    UVa 784 Maze Exploration
    Pacemaker+ISCSI实现Apache高可用-环境准备
    多机免密互信
    HAPROXY + Keepalived
    LVS+KEEPALIVED
    oracle-数据库被注入恶意攻击程序的案例恢复
  • 原文地址:https://www.cnblogs.com/hoiday/p/10073982.html
Copyright © 2020-2023  润新知