• 指针数组、数组指针和传参的相关问题


    🚵目录

    目录

    1.指针数组:存放指针的数组,就是一个数组,只不过存储的不是整型、浮点型而是指针

    2.数组指针:能够指向数组的指针,是一个指针。

    3.传参

     结语:


    🔥🔥指针数组:存放指针的数组,就是一个数组,只不过存储的不是整型、浮点型而是指针

    形式:int* arr[10] :

    注意:arr是和 [ ] 先结合在和 * 结合,因为 [ ] 的优先级比 * 高

    使用:

    通过指针数组,我们就可以用一维数组来实现二维数组 👇👇

    1. #include <stdio.h>
    2. int main()
    3. {
    4. int arr1[] = { 1,2,3,4,5 };
    5. int arr2[] = { 2,2,3,4,5 };
    6. int arr3[] = { 3,2,3,4,5 };
    7. int* parr[3] = { arr1,arr2,arr3 };
    8. int i = 0;
    9. for (i = 0; i < 3; i++)
    10. {
    11. int j = 0;
    12. for(j=0;j<5;j++)
    13. {
    14. printf("%d ", *(parr[i] + j));
    15. }
    16. printf("\n");
    17. }
    18. return 0;
    19. }

    🔥🔥数组指针:能够指向数组的指针,是一个指针。

    我们都知道:

    整型指针:能够指向整形数据的指针

    浮点型指针:能够指向浮点型数据的指针

    数组指针:能够指向数组的指针,是一个指针。

    形式: int (*p2) [10]; 是个数组指针,指向的是数组,该数组有10个元素,每个元素int类型,p2的类型是指针数组扣掉p2,剩下的就是p2的类型,int(* ) [10]

    注:因为 p1是和 [ ] 先结合在和 * 结合,因为 [ ] 的优先级比 * 高

    使用:

    想用好数组指针,先要掌握以下内容: 👇👇

    我们知道数组名一般就是数组首元素的地址,但是有俩个例外!!

    特殊:以下表示的是整个数组的地址

    ➀ sizeof(单独放一个数组名),注:sizeof(arr+0)不叫单独放一个数组名

    ➁ &数组名,

    看代码:(arr表示的就是数组的首元素地址,用指针数组来写反而复杂)

    以下情况用途较少,数组指针常用于二维数组和三维数组

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

     👇👇

    (当实参是二维数组名时,形参可以用数组指针接收)

     特别注意:

    本题arr是数组名,表示数组首元素的地址

    二维数组的首元素是二维数组的第一行(本题传递的arr,是一维数组的地址)

    ➂接收一个指针,该指针指向的是数组,所以可以采用数组指针来实现

     以上代码如下:

    1. #include <stdio.h>
    2. void print_arr1(int arr1[3][5], int row, int col)
    3. {
    4. int i = 0;
    5. for (i = 0; i < row; i++)
    6. {
    7. int j = 0;
    8. for (j = 0; j < col; j++)
    9. {
    10. printf("%d ", arr1[i][j]);
    11. }
    12. printf("\n");
    13. }
    14. }
    15. void print_arr2(int(*p)[5], int row, int col)
    16. {
    17. int i = 0;
    18. for (i = 0; i < row; i++)
    19. {
    20. int j = 0;
    21. for (j = 0; j < col; j++)
    22. {
    23. printf("%d ", *(*(p + i) + j));
    24. }
    25. printf("\n");
    26. }
    27. }
    28. int main()
    29. {
    30. int arr[3][5] = { 1,2,3,4,5,6,7,8,9,10 };
    31. print_arr1(arr, 3, 5);
    32. print_arr2(arr, 3, 5);
    33. return 0;
    34. }

    🔥🔥传参

    上面涉及到了数组传参,在本部分归纳一下一维数组传参、二维数组传参、一级指针传参、二级指针传参的核心内容

    一维数组传参

     

     ②

     代码如下:

    1. void test1(int arr[10])
    2. {}
    3. void test1(int arr[])
    4. {}
    5. void test1(int* p)
    6. {}
    7. int main()
    8. {
    9. //一维数组
    10. int arr[10] = { 0 };
    11. test1(arr);
    12. return 0;
    13. }
    14. void test2(int* arr2[20])
    15. {}
    16. void test2(int** p)
    17. {}
    18. int main()
    19. {
    20. //指针数组传参
    21. int* arr2[20] = { 0 };
    22. test2(arr2);
    23. return 0;
    24. }

    二维数组传参:

    二维数组的数组名,表示首元素的地址,其实就是第一行的地址

     代码如下:

    1. void test(int arr[3][5])
    2. {}
    3. void test(int arr[][5])
    4. {}
    5. void test(int arr[][])
    6. {}
    7. void test(int (*arr)[5])
    8. {}
    9. void test(int* arr)
    10. {}
    11. void test(int* arr[5])
    12. {}
    13. void test(int** arr)
    14. {}
    15. int main()
    16. {
    17. int arr[3][5] = { 0 };
    18. test(arr);
    19. return 0;
    20. }

     一级指针传参:

    换个角度理解,如果函数的参数部分是指针,实参怎么写呢

     代码如下:

    1. void print(int* p)
    2. {}
    3. int main()
    4. {
    5. int a = 10;
    6. int* ptr = &a;
    7. int arr[10] = { 0 };
    8. print(&a);
    9. print(ptr);
    10. print(arr);
    11. return 0;
    12. }

    二级指针传参:

    换个角度,如果函数的形参是二级指针,实参怎么写呢

     代码如下:

    1. void test(int** p)
    2. {}
    3. int main()
    4. {
    5. int* p1;
    6. int** p2;
    7. int* arr[10];
    8. test(&p1);
    9. test(p2);
    10. test(arr);
    11. return 0;
    12. }

    🚵 结语:

    如果对您有帮助的话,

    不要忘记点赞+关注哦,蟹蟹

    如果对您有帮助的话,

    不要忘记点赞+关注哦,蟹蟹

    如果对您有帮助的话,

    不要忘记点赞+关注哦,蟹蟹

  • 相关阅读:
    Web前端系列技术之Web APIs基础(从基础开始)③
    xxl-job环境搭建详细
    DHCP执行流程详解
    《硅基物语.AI写作高手:从零开始用ChatGPT学会写作》&《从零开始读懂相对论》
    微信小程序 动漫游戏资讯推荐系统
    什么是ElasticSearch的深度分页问题?如何解决?
    花6000报了测试培训班,3个月后我成功“骗”进了腾讯,月薪拿17k
    2024-02-23(Spark)
    【HDFS】cachingStrategy的设置
    美团面试:微服务如何拆分?原则是什么?
  • 原文地址:https://blog.csdn.net/qq_68993495/article/details/125416168