C语言笔记三数组指针、二级指针一、指针数组 数组指针1. 指针数组本质是一个数组。数组中的元素是指针字符类型指针用得最多。数据类型*数组名[整型常量];int*a[4];char*a[4]{NULL};char*b[5]{hello,ok,how,are,you};// 指针指向字符串常量区只可读不可修改charstr[8][100]{hello,ok,how,are,you};char*str3[5]{str[0],str[1],str[3]};// 指针指向数组可以读取可以修改经验总结存放字符串 → 使用字符数组操作字符串 → 使用指针存放多个字符串 → 使用二维字符数组操作字符串数组 → 使用指针数组2. 数组指针本质指向数组的指针。关键规则对一维数组名执行取地址 地址值不变类型升级为指向整个数组的指针对数组指针执行解引用 *地址值不变类型降级为指向第一个元素的指针inta[5]{1,2,3,4,5};printf(a addr %p\n,a);// int * - 首元素地址printf(a %p\n,a);// int (*)[5] - 数组指针printf(a1 %p\n,a1);// 跳过整个数组int(*p)[5]a;// 数组指针与二维数组配合使用intarray2[4][4]{1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};int(*p2)[4]array2;// 数组指针指向二维数组// 访问方式printf(a[1][2] %d\n,array2[1][2]);printf(a[1][2] %d\n,*(array2[1]2));printf(a[1][2] %d\n,*(*(array21)2));printf(p2[1][2] %d\n,p2[1][2]);printf(p2[1][2] %d\n,*(p2[1]2));printf(p2[1][2] %d\n,*(*(p21)2));// 类型对照// array2 - int (*)[4] 1 - sizeof(int) * 4 列// array2[0] - int * 1 - 第一行首元素地址 array2[0][0]// array2[0][0]- int - 数据// p2 - int (*)[4]// p2[0] - int *// p2[0][0] - int// p2[1] - *(p2 1) (下标运算符 解引用运算符)三、二级指针本质指向指针的指针。定义指针变量时会开辟8字节空间指针变量本身也有内存地址对一级指针取地址操作 → 获得二级指针需要解引用两次才能访问到数据使用场景场景传参类型需要在被调函数中修改指针的指向指针本身传递二级指针需要在被调函数中修改指针指向的内容传递一级指针错误示例一级指针无法修改指向voidfun(char*arg_p){staticcharstr[10]hello;arg_pstr;// ❌ 无法修改主调函数中指针的指向}intmain(intargc,char**argv){char*pNULL;fun(p);printf(p is %s\n,p);// NULLreturn0;}正确示例使用二级指针voidfun2(char**arg_p){// 二级指针staticcharstr[10]hello;*arg_pstr;// ✅ 可以修改主调函数中的指针}intmain(intargc,char**argv){char*pNULL;fun2(p);printf(p is %s\n,p);// helloreturn0;}