• 指针扩展之——数组指针


    前言:小伙伴们好久不见,因为刚刚开学事情比较多,所以好久没有更新,还请大家见谅。

    那么从今天开始,博主承诺每周至少会出1-2篇博客,感谢小伙伴们的支持!

    今天这篇文章,我们一起来了解以下指针的扩展——数组指针


    目录

    一.什么是数组指针

    二.重温数组名的多种用法

    三.数组指针的形式

    四.数组指针的使用

    五.总结


    一.什么是数组指针

    我们之前已经学习过了指针的基础知识,知道了字符指针,整形指针,那么什么是数组指针呢?

    字符指针,是一个指向字符地址的指针;整型指针,是一个指向整型地址的指针

    那么同理,数组指针,就是一个指向数组地址的指针呗

    二.重温数组名的多种用法

    我们知道,数组名在大多数情况下代表的是数组首元素的地址,但是也有两个例外:

    1. sizeof(数组名):数组名代表的是整个数组,计算的是整个数组的大小,单位是字节。
    2. &数组名:数组名也表示整个数组,取出的是整个数组的地址。

    除了这两种特例之外,数组名用在其他地方均代表的是数组首元素的地址。

    三.数组指针的形式

    int a = 5;

    int* p = &a;

    char ch = 'b';

    char* p = &ch;

    这是整型指针和字符型指针的形式。那么数组指针又会是什么形式呢?

    Int arr[5] = {1,2,3,4,5};

    int (*p) [5] = &arr;

    这便是数组指针的形式,*p代表着这是一个指针,[5]则表示这个指针指向的是一个数组,Int则表示指针指向的数组的类型

    有的小伙伴们可能会问,()可以不要吗?

    如果不要的话,就变成了int* p[5],这个是不是看着很眼熟?

    没错,这是指针数组,是一个存放指针类型元素的数组,因为p会先跟[]结合

    要注意一点就是不管你创建数组时有没有指定数组的大小,但是当你用一个数组指针指向一个数组时,数组的大小就不能省略,因为这样会被编译器认为指针指向了一个未知大小的数组

    那么我们这里出个小问题:

    int* arr[5];

    如果用数组指针指向这个数组,该怎么表示?

    Int* (*p)[5] = &arr;

    小伙伴们答对了吗?

    我们知道最上边是一个指针数组,那么我们要用一个数组指针去指向一个指针数组,就意味着这个指针要指向的是一个存放指针类型的数组,所以除(*p)外是Int* [5]这样一个指针数组的形式。

    四.数组指针的使用

    既然数组指针是一种指向数组的指针,那我们就用它来调用数组呗:

    1. #include
    2. int main()
    3. {
    4. int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
    5. int(*p)[10] = &arr;
    6. int i = 0;
    7. for (i = 0; i < 10; i++)
    8. {
    9. printf("%d ", (*p)[i]);
    10. }
    11. return 0;
    12. }

    比如说我们用数组指针来打印数组的元素,看起来像是很正常的事,但是有没有觉得很别扭?

    如果想要打印一个一维数组的元素,是不是直接用普通的指针就可以了?

    1. #include
    2. int main()
    3. {
    4. int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
    5. int* p = arr;
    6. int i = 0;
    7. for (i = 0; i < 10; i++)
    8. {
    9. printf("%d ", p[i]);
    10. }
    11. return 0;
    12. }

    用普通的指针更方便也更易懂,那么数组指针到底该怎么使用呢?

    实际上,数组指针的使用与函数和二维数组关系密切

    如果将一维数组传递给函数,那么函数的形参接收的是数组首元素的地址,用普通的指针便可。

    但是我们知道二维数组的数组名代表着数组第一行的地址是一个数组的地址,这个时候,函数的形参接收的是一个数组的地址,便需要用到数组指针来接收了。

    我们实现一个打印二维数组元素的函数:

    1. #include
    2. void print(int(*p)[5], int r, int c)
    3. {
    4.     int i = 0;
    5.     for (i = 0; i < 3; i++)
    6.     {
    7.         int j = 0;
    8.         for (j = 0; j < 5; j++)
    9.         {
    10.             printf("%d ", p[i][j]);
    11.         }
    12.         printf("\n");
    13.     }
    14. }
    15. int main()
    16. {
    17.     int arr[3][5] = { {1,2,3,4,5},{6,7,8,9,10},{11,12,13,14,15} };
    18.     print(arr, 3, 5);
    19.     return 0;
    20. }

    五.总结

    以上便是有关数组指针的相关知识啦,这部分知识虽不常用,但也很重要,希望小伙伴们能够耐心掌握!

    最后,喜欢博主文章的小伙伴们不要忘记一键三连哦!

    我们下期再见!

  • 相关阅读:
    C语言函数调用的过程图解深入剖析
    搭建web网站
    沉睡者IT创业项目 - 学习如何玩直播卖零食
    JAVA开发(Redis的使用, redis数据类型)
    第六章 图 七、最短路径(BFS算法、Dijkstra算法、Floyd算法)
    CAS:474922-22-0 Maleimide-PEG-DSPE 磷脂-聚乙二醇-马来酰亚胺简述
    信息登记小程序怎么做_扫码等级小程序制作步骤
    十三、【画笔工具组】
    携程开源分布式配置系统Apollo服务端是如何实时更新配置的?
    [山东科技大学OJ]1653 Problem C: 藏头诗
  • 原文地址:https://blog.csdn.net/2303_78442132/article/details/132790618