day13 指针数组 与 数组指针

📅 2026/8/4 4:28:56
day13 指针数组 与 数组指针
前言指针数组、数组指针是 C 语言极易混淆的知识点结合一维、二维数组、二级指针梳理核心概念方便嵌入式开发学习查阅。一、void * 无类型指针void *p;64 位系统下所有指针占用8 字节void*可以接收任意类型变量地址无法直接解引用、不能直接进行指针偏移运算适用场景通用内存操作memcpy、通用函数传参使用时需要强制转换为对应类型指针。二、二级指针int num 10; int *p num; int **q p; // 二级指针存储一级指针变量的地址核心用途 若需要在函数内部修改函数外部指针变量本身的值必须传递指针的地址也就是二级指针。三、指针数组定义区分口诀[]优先级高于*int *a[5];本质数组数组包含 5 个元素*每个元素是 int类型指针内存大小5 × 8 40 字节64 位。典型应用多字符串管理// char* 指针数组存放多个字符串首地址 char *str_arr[] {hello, c, embed};区分 二维字符数组char buf[3][20]字符串存储在栈空间char *str_arr[]指针数组仅保存字符串常量首地址字符串存放于只读常量区。四、数组指针int (*p)[5];括号提升*优先级本质指针固定 8 字节该指针指向一个包含 5 个 int 元素的一维数组。一维数组与数组指针int arr[5] {1,2,3,4,5};绝大多数场景下数组名arr等价arr[0]类型为int *数组名两个特殊场景不再指向首元素sizeof(arr)计算整个数组占用内存arr获取整个数组的地址类型升级为数组指针int (*)[5]。plaintextarr → int * 指向数组首元素 arr → int (*)[5] 指向整个数组 *arr → 等价arr类型降级为 int *五、二维数组 和 数组指针嵌入式高频考点int a[2][3] { {1, 2, 3}, {4, 5, 6} };二维数组可以理解为存放 2 个int[3]一维数组。a[0]代表第 0 行一维数组a[1]代表第 1 行一维数组。int *p NULL; // 指向单个整型元素 int (*q)[3] NULL; // 数组指针指向长度为3的int一维数组赋值规则p a[0][0]; p a[0]; p *a; q a;地址含义a数组指针指向二维数组第一行a[0]指针指向第一行第一个元素a[1]指针指向第二行第一个元素。多维元素多种访问写法a[m][n]; *(a[m]n); *(*(am)n); *(q[m]n); *(*(qm)n); q[m][n];二维数组函数传参标准写法二维数组传参本质传递数组指针需要写明每行元素个数int fun(int (*parray)[3], int row_len);核心总结区分int *a[5]; // 指针数组数组元素是指针 int (*p)[5]; // 数组指针指针指向一维数组