• 数组指针的使用


    上一篇博客笔者介绍了数组指针,但是数组指针的使用,对于不少读者或多或少的有着些许疑惑!下面笔者将带领大家走进数组指针的使用!!

    下面请看笔者将用代码+解析的过程来带领大家分析!

    1. #include <stdio.h>
    2. void print1(int arr[], int sz)
    3. {
    4. int i = 0;
    5. for (i = 0; i < sz; i++)
    6. {
    7. printf("%d ", arr[i]);
    8. }
    9. printf("\n");
    10. }
    11. int main()
    12. {
    13. int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
    14. int sz = sizeof(arr) / sizeof(arr[0]);
    15. print1(arr, sz);
    16. return 0;
    17. }

    上述代码是刚刚学习函数时候就具备的知识,在此,笔者就不做过多的讲述!但是对于sz的值为什么在main函数里面来求,而不是在print1函数里面求,大家应该也能知道!但是,笔者在此,仍忍不住想提醒一下!对于数组传参,传过去的是首元素的地址,如果sz在print1里面来求,则计算的是地址的大小,4个字节,而不是数组元素的大小!所以sz要在main函数里面来求,并且作为实参传过去!

    下面是对print1的函数进行更改!请看代码:

    1. void print1(int* arr, int sz)
    2. {
    3. int i = 0;
    4. for (i = 0; i < sz; i++)
    5. {
    6. printf("%d ", *(arr + i));
    7. }
    8. printf("\n");
    9. }

    上面的代码运行结果也是一样的!运行结果为:

     下面来讲解一下:数组指针在一维数组中的使用!(啰嗦麻烦)

    1. #include <stdio.h>
    2. void print2(int(*p)[10], int sz)
    3. {
    4. int i = 0;
    5. for (i = 0; i < sz; i++)
    6. {
    7. printf("%d ", (*p)[i]);
    8. }
    9. printf("\n");
    10. }
    11. int main()
    12. {
    13. int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
    14. int sz = sizeof(arr) / sizeof(arr[0]);
    15. print2(&arr, sz);
    16. return 0;
    17. }

    在上述代码段中,数组传参,传过去的就是:     print2(&arr, sz);    对于形参的内容,请大家认真分析!   &arr  取出的是整个数组的地址!然后作为实参传递给形参:int(*p)[10]!该形参的类型为:int(*)[10]  类型!

    在这面: int(*p)[10]  ,将地址交给了p, p就相当于:&arr,  *p相当于*&arr--->arr!

    对于:(*p)[i]中:*p是对p进行解引用:得到整个数组,在通过 [i] 下标,来打印整个数组!

    打印的结果也是一样的!

     但是对于上述案列,大家也可以看出来,虽然成功的用了数组指针,但是有着明显的啰嗦麻烦!所以很少使用过!因为数组指针一般在二维数组的使用较为广泛!

     下面来讲解一下:数组指针在一维数组中的使用!

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

    在上述代码中,笔者用了:数组传参,数组接收这个方法来书写代码!这个也是最常规的写法!

    但是,我们需要注意的是: print3(arr, 3, 5);部分,二维数组的数组名也是首元素的地址,因此也可以用指针来接收!即:数组传参,指针接收!

    但是对于二维数组的首元素,大家目前还是都存有疑惑,不知道该如何去思考!!

    下面,笔者来大家来带领对二维数组的首元素进行分析!

    arr是数组名,数组名就是数组首元素的地址!因此:arr就是第一行的地址!(可以当作一维数组来使用)

    对于  :    

    1. int arr[3][5] = { {1,2,3,4,5},{2,3,4,5,6},{3,4,5,6,7} };
    2. print3(arr, 3, 5);

    数组名是数组首元素的地址!

    即:

     对于二维数组arr[3][5],3行5列,将每一行看作一个元素,则arr[3][5]:有3个元素,每个元素都是含有5个整型的一位数组!

    !因此对于二维数组的首元素!转化为一维数组才有首元素!

    对于一维数组的地址,就应该放到数组指针里面!

    1. {
    2. int arr[3][5] = { {1,2,3,4,5},{2,3,4,5,6},{3,4,5,6,7} };
    3. print4(arr, 3, 5);
    4. }

    对于上述arr,传参传的是二维数组的数组名,传过去之后,变成(首元素的地址)第一行元素的地址!

    1. void print(int(*p)[5], int r, int c)
    2. {
    3. }

    对于上述代码,int(*p)[5]:指向一维数组的数组指针!

    下面请看笔者用指针来写的代码:

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

    对于上述:*(*(p + i) + j)  表示:第i行里面的 j元素的值!下面对其进行分组解析!

    p+i :;相当于第 i 行的地址!

    *(p+i):;相当于拿到第 j 行!

    *(p+i)+j ::依次往后走!

    *(*(p+i)+j)::解引用得到数值!

     

    上述就是笔者对于数组指针的了解与认识!

    若有不足,请大家指教!

  • 相关阅读:
    vivo霍金实验平台设计与实践-平台产品系列02
    Spring5学习笔记02--BeanFactory 与 ApplicationContext 容器实现
    机器人抓取(七、八)—— kinect 相机的 ros 服务器及 基于gqcnn 抓取 ros 服务器
    SpringBoot基于RBAC自制简易的权限验证(AOP自定义注解)
    用 ChatGPT 做一个 Chrome 扩展 | 京东云技术团队
    数据结构理论知识
    ShellBrowser Delphi,Delphi组件功能和工具
    Python每日一练(牛客数据分析篇新题库)——第37天:合并
    网络安全笔记6——数字证书与公钥基础设施
    mysql查询条件字段值末尾有空格也能查到数据问题
  • 原文地址:https://blog.csdn.net/weixin_64308540/article/details/126764138