zoukankan      html  css  js  c++  java
  • 第32课

    第32课 - 数组指针和指针数组分析

    1. 数组的类型

      C语言中的数组有自己特定的类型,数组的类型由 元素类型数组大小 共同决定。比如 int array[5] 的类型就是 int[5]float farray[10] 的类型就是 float[10]

    2. 定义数组类型

    C语言中通过typedef为数组类型重命名:

      typedef type (name)[size];

    使用这种方式重命名如下两个数组

      typedef int (AINT5)[5];     typedef float (AFLOAT10)[10];

    那么就可以使用 AINT5AFLOAT10 定义数组,AINT5 iArray;   AFLOAT10 fArray   // iArray、fArray是数组名

    3. 数组指针

    (1)数组指针,顾名思义就是一个指针,只不过该指针用于指向一个数组

    (2)前面学习数组时说过,数组名是数组首元素的地址,并不是整个数组的地址,使用&作用于数组名可以得到数组的地址

    (3)定义数组指针的三种方式

    ① 可以通过数组类型定义数组指针:ArrayType *pointer;

    ② 可以直接定义:type (*pointer)[n];     // pointer为数组指针变量名,type为数组元素的类型,n为数组的大小

    ③ 先使用typedef重命名数组指针类型typedef type (*POINTER)[n],然后使用该类型定义数组指针变量 POINTER pointer;

    【数组类型和数组指针】

     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;   // int a1[5]
    10     float fArray[10];
    11     AFLOAT10* pf = &fArray;
    12     ACHAR9 cArray;
    13 
    14     char(*pc)[9] = &cArray;
    15     // char(*pcw)[4] = cArray;   // 类型不匹配,数组名表示数组首元素的地址,对数组名&表示数组的地址
    16     char(*pcw)[4] = (char(*)[4])cArray;
    17 
    18     int i = 0;
    19     
    20     printf("%zu, %zu
    ", sizeof(AINT5), sizeof(a1));  // 20 20
    21     
    22     for(i=0; i<10; i++)
    23     {
    24         (*pf)[i] = i;  // fArray[i] = i;
    25     }
    26 
    27     printf("pf = %p, pf + 1 = %p
    ", pf, pf+1);   // float占4字节 pf = 0x7ffdb9e61e10, pf + 1 = 0x7ffdb9e61e38
    28 
    29     for(i=0; i<10; i++)
    30     {
    31         printf("%f
    ",fArray[i]); // 打印 0 到 9
    32     }
    33 
    34     // 0x7ffdc9e322a0, 0x7ffdc9e322a9, 0x7ffdc9e322a0 ,0x7ffdc9e322a4
    35     printf("%p, %p, %p ,%p
    ", &cArray, pc+1, pcw, pcw+1);   // pc + 1 ==> (unsigned long)pc + 1*sizeof(*pc) ==> (unsigned long)pc + 9
    36                                                              // 同理 pcw + 1 = (unsigned long)pcw + 4
    37 
    38     return 0;
    39 }

    4. 指针数组

    (1)指针数组,顾名思义就是一个数组,该数组的元素类型为指针类型

    (2)指针数组的定义:

          type *PArray[n]

    【指针数组的应用】

     1 #include <stdio.h>
     2 #include <string.h>
     3 
     4 // DIM是维度(dimension)的缩写,一维数组的维度就是数组元素的个数
     5 #define DIM(a) (sizeof(a)/sizeof(*a))
     6 
     7 //table指向一个指针数组,即每个元素为指针类型
     8 int lookup_keyword(const char* key, const char* table[], const int size) // ① 数组作为形参退化为指针类型  ② 需要传入数组长度信息
     9 {                                           // char *table[] 等价于 char **table,但是后者看起来更加直观,推荐使用这种写法
    10     int ret = -1;
    11     int i = 0;
    12     
    13     for(i=0; i<size; i++) {
    14         if(strcmp(key, table[i]) == 0) {
    15             ret = i;
    16             break;
    17         }
    18     }
    19     
    20     return ret;
    21 }
    22 
    23 int main()
    24 {
    25     const char* keyword[] = {   // 这里就是一个字符指针数组
    26            "do",
    27            "for",
    28            "if",
    29            "register",
    30            "return",
    31            "switch",
    32            "while",
    33            "case",
    34            "static"
    35     };
    36     
    37     printf("%d
    ", lookup_keyword("return", keyword, DIM(keyword))); // 4
    38     printf("%d
    ", lookup_keyword("main", keyword, DIM(keyword)));   // -1
    39 
    40     return 0;
    41 }
  • 相关阅读:
    上网助手(集成ipv6)windows版
    c# 串口编程
    test blog
    用于主题检测的临时日志(d020b283408c4bc68872f97ee237b663 3bfe001a32de4114a6b44005b770f6d7)
    OpenGL概述 陌陌
    [转载][转帖]谈谈我对攻读计算机研究生的看法。。。大牛的文章,见解精深独到
    滚动值的兼容问题
    js小练习去掉指定的字符组成一句话输出
    马虎将classname加到了id属性中,造成报错
    锋利的jquery读书笔记(一)
  • 原文地址:https://www.cnblogs.com/shiwenjie/p/11853989.html
Copyright © 2011-2022 走看看