• C语言:数组指针


    一、数组指针本质

    数组指针本质是一个指针,该指针存放的是数组的地址。

    int nums[10] = { 1,2,3,4,5,6,7,8,9,10 };
    int(*p)[10] = &nums;

    二、数组指针类型

    int nums[10] = { 1,2,3,4,5,6,7,8,9,10 };
    int(*p)[10] = &nums;

    对于数组指针p来说,其指针类型是 int (*) [10]

    char arr[5] = { 'a','b','c','d','e' };
    char(*q)[5] = &arr;

    对于数组指针q来说,其指针类型是 char (*) [5]

    在定义数组指针时,(*变量名),因为 [ ] 的优先级比 * 高,如果不用括号,则变量名先与[ ]结合,这样就变成了一个数组,用括号则先与 * 结合,这样才是一个指针。

    以 int(*p)[10] = &nums 为例,(*p)表明p是一个指针,[10]表明指针p指向一个元素个数为10的数组,int 表明该数组是int型数组。

    char* arr[5];
    char* (*p1)[5] = &arr;

    p1是数组指针,指向一个指针数组,该数组存放的是5个char型指针

    int nums[] = { 1,2,3 };
    int(*p2)[3] = &nums;

    p2是数组指针,指向一个int型数组,该数组存放的是3个int型数据

    (注意:定义数组指针时 [常量]不可省略,即使数组没有表明元素个数,自己数也要数出来,填入常量 )

    三、数组指针的用法

    数组指针有什么用处?难道仅仅是存放一下数组的地址吗?

    1. int nums[5] = { 1,2,3,4,5 };
    2. int(*p)[5] = &nums;
    3. for(int i = 0; i < 5; i++)
    4. {
    5.     printf("%d ", (*p)[i]);//(*p)相当于数组名nums,(*p)[i]相当于*(*p+i)
    6. }

    如果仅仅是这样,那不如直接用普通指针变量来接收数组的地址

    1. int nums[5] = { 1,2,3,4,5 };
    2. int* p = nums;
    3. for (int i = 0; i < 5; i++)
    4. {
    5. printf("%d ", p[i]);//p[i]相当于*(p+i)
    6. }

    显然数组指针的用处绝不是如此使用。

    数组指针其实是在当二维数组需要传参时,用于接收二维数组的,因为数组传参时传的都是数组首元素地址,一维数组首元素地址是第一个元素的地址,而二维数组的首元素地址是一第一行的地址,第一行其实就是一个一维数组,因此可以用数组指针接收。

    1. void Print(int(*p)[5], int r, int c)
    2. {
    3. for (int i = 0; i < r; i++)
    4. {
    5. for (int j = 0; j < c; j++)
    6. {
    7. printf("%d ", p[i][j]);//p[i]相当于*(p+i),p[i][j]相当于*(*(p+i)+j)
    8. }
    9. printf("\n");
    10. }
    11. }
    12. int main()
    13. {
    14. int nums[3][5] = { {1,2,3,4,5},{2,3,4,5,6},{3,4,5,6,7} };
    15. Print(nums,3,5);
    16. return 0;
    17. }

    四、小练习:区分下列是指针还是数组

    int arr1[5]    是数组,存放的是5个int型数据

    int *arr2[10]    是指针数组,存放的是10个指针,每个指针指向的是int型数据

    int (*arr3)[10]    是数组指针,存放的是一个数组的地址,该数组中存放的是10个int型数据

    int (*arr4[10])[5]    是数组,存放的是10个数组指针,每个数组指针指向一个存放5个int型数据的数组

  • 相关阅读:
    如何进行SEO优化数据分析?(掌握正确的数据分析方法,让您的网站更上一层楼!)
    云架构(五)BBF模式
    流媒体传输 - RTP 荷载 H265
    自动导入时,Element-plus Message Box组件样式丢失
    序列合并
    腾讯云2023年最新优惠券领取入口
    uni-app —— 小程序登录功能的相关实现
    【Linux系列】深入理解 CURL 命令及其在网络请求中的应用
    51单片机应用从零开始(二)
    【Rust基础④】Rust中的集合类型(Vector与HashMap)
  • 原文地址:https://blog.csdn.net/2301_76197086/article/details/133174063