第6章 C语言的指针数组 (六)

发布于:2023-01-02 ⋅ 阅读:(487) ⋅ 点赞:(0)

文档视频讲解链接地址

  1. 腾讯课堂链接 : 62_指针_const与void类型指针

6.7 指针数组

  1. 所谓指针数组是指由若干个具有相同存储类型和数据类型的指针变量构成的集合。

    • 指针变量数组的一般说明形式:
     <存储类型>  <数据类型>  *<指针变量数组名>[<大小>]//指针数组名就表示该指针数组的存储首地址,即指针数组名为数组的首地址(指针)。 
    
  2. 说明一个指针数组:

    • 例如:
    double a[2][3]; 
    double  *pa[2] ; // 数组的优先级最高, 比 * 的优先级高, pa所以先结合[], 因此pa是数组, (doube *)起修饰作用, 所以这个数组是一个指针类型的数组, 简称指针数组 
    //把一维数组a[0]和a[1]的首地址分别赋予指针变量数组的数组元素pa[0]和pa[1]:
    pa[0]=a[0] ;       // 等价pa[0] = &a[0][0];
    pa[1]=a[1];        // 等价pa[1] = &a[1][0];
    //则pa[0]和pa[1]两个指针分别指向了两个一维数组a[0]和a[1]。
    //这时我们可以通过两个指针pa[0]和pa[1]对二维数组中的数据进行处理。
    
  3. 指针数组实例
    01-c-86

  4. 字符指针数组

    • 在C语言中,一维字符数组的数据可以使用相应的一个字符指针进行处理。
    • 例如,有一个一维字符指针数组ps[5]
    char *ps[5]= {  "Beijing city",
                    ……
                    "London city"  } ; 
    // ps 是一个数组, 里面有5个元素, ps[0],ps[1],ps[2],ps[3],ps[4], 每一个元素都是一个字符指针变量(char *)
    // 可以把一个字符串初始化给一个字符指针变量 char * p = "Beijing city"
    
    char ** pps = ps ; // pps想要指向ps[0]的地址, pps = &ps[0] , 用来保存指针变量地址的变量, 需要使用二级指针
    pps = ps ; 
    

    01-c-87

    • 定义另一个指针变量pps,并且把指针数组的首地址赋予指pps。
  5. 多级指针

    • 我们把一个指向指针变量的指针变量,称为多级指针变量。对于指向处理数据的指针变量称为一级指针变量,简称一级指针。而把指向一级指针变量的指针变量称为二级指针变量,简称二级指针。
    • 二级指针变量的说明形式如下:
      <存储类型> <数据类型> ** <指针名> ;
  6. 实例81

    • 使用字符指针数组输出星期一到星期日(Mon,Tue,Wed,Thu,Fri,Sat,Sun)
    • 源文件
    01-cbase\81-week.c
    
    • 源代码
    #include <stdio.h> 
    
    int main(int argc, char const *argv[])
    {
        // 因为[] 的优先级高于 * 的优先级 , week 先结合[] , 因此week 是一个数组 
        // char * 起到一个修饰的作用, 用来修饰 week 是一个字符指针类型的数组 
        // 数组中的每一个元素都是一个字符指针变量,
        // 字符指针变量可以被初始化一个字符串 
        char * week[] ={"Mon","Tue","Wed","Thu","Fri","Sat","Sun"} ;
    
        // 计算week占用内存的字节数 , 数组一共有7个元素, 每一个元素都是一个字符指针变量
        // 一个指针变量保存一个地址, 一个地址是64位的, 因此一个指针变量占用8字节 
        // 7*8 = 56 
        printf("sizeof(week) = %d\n",sizeof(week)) ; 
        printf("sizeof(week[0]) = %d\n",sizeof(week[0])) ;  // 一个元素占用的字节数  等价于sizeof(char *) = 8 
        for(int i=0;i<sizeof(week)/sizeof(week[0]) ;i++ )
        {
            printf("week[%d]=%s\n",i,week[i]);
        }
    
        return 0;
    }
    
    • ​ 运行结果
    sizeof(week)=56
    sizeof(week[0])=8
    week[0]=Mon      
    week[1]=Tue      
    week[2]=Wed      
    week[3]=Thu      
    week[4]=Fri
    week[5]=Sat
    week[6]=Sun
    
  7. 实例82

    • 在星期一到星期日中随机一个日期

    • 提示: 需要使用随机函数 srand 和rand

    void srand(unsigned int seed);
    // 函数功能 :安装随机因子 
    // seed : 随机因子 
    
    int gettimeofday(struct timeval *tv, struct timezone *tz);
    // 函数功能: 获取系统的时间 
    // tv 的定义, 
    // 使用这个函数的目的是未来获取一个随机因子, 微妙数
    struct timeval {
        time_t      tv_sec;     /* seconds */
        suseconds_t tv_usec;    /* microseconds */ 
    };
    struct timezone {
        int tz_minuteswest;     /* minutes west of Greenwich */
        int tz_dsttime;         /* type of DST correction */
    };
    
    int rand(void);
    // 函数功能:产生一个随机数 
    
    
    
    • 源文件
    01-cbase\82-rand.c
    
    • 源代码
    #include <stdio.h> 
    #include <sys/time.h>
    #include <stdlib.h> 
    #include <unistd.h>
    
    
    
    
    int main(int argc, char const *argv[])
    {
        char *class[] = {"林  涛","张美玲","姬  璐","胡衍宇","张玉环"
                        } ; 
        struct timeval tv;   // 定义时间结构体
        struct timezone tz;  // 定义时区结构体
        gettimeofday(&tv,&tz); // 获取系统的时间 
        printf("tv.tv_usec=%d\n",tv.tv_usec); // 获取系统时间的微妙数 
        srand(tv.tv_usec) ; // 安装随机因子 
        int num =0 ; // 随机数 
       // printf("num=%d\n",num);// 打印随机值
        for(int i=0;i<50;i++)
        {
            num = rand()%( sizeof(class)/sizeof(class[0]) );
            printf("姓名为:%s\r",class[num]); // \r 光标移动到开始, 不换行 , \n 是换行 
            usleep(50000) ; // 延时100us 
        }
        printf("\n"); // 换行后就会输出人名 
    
        return 0;
    
    }
    
    
    • 运行结果
    // 第一次
    tv.tv_usec=994334
    姓名为:胡衍宇
    // 第二次
    tv.tv_usec=353398
    姓名为:林 涛
    
本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到