尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

指针小结3(指针数组数组指针)

指针小结3(指针数组数组指针) 文章大纲一、引言指针与数组在C语言中的重要性指针数组与数组指针的概念混淆问题本文目标清晰区分两者并掌握实际应用指针指针数组指的是一个数组里面元素是指针。每个数组元素都可以存储一个指针这些指针通常指向其他数据类型的变量或内存块。应用场景字符串数组、动态内存管理函数指针数组定义例 int *arr[5]就是一个包含了5个int类型数据指针数组arr是一个数组包含5个元素每个元素都是一个int*类型的指针。int a10,b20;int *arr[2]; //指针数组包含2个元素arr[0]a; //第一个元素指向a的地址arr[1]b; //第二个元素指向b的地址printf(arr[0]指向的值:%d\n,*arr[0]); //输出10printf(arr[1]指向的只:%d\n,*arr[1]); //输出20内存大小数组总大小n*sizeofint*每个格子存一个指针。示例int a10,b20,c30;int *p[3] {a, b, c};printf(%d, *(p[0])); // 等价*(a) →10字符串数组// 指针数组每个元素是char*字符串首地址char *strArr[] {apple,banana,cat};注意点字符串字面量存这只读常量区不能修改内容类似于strArr[0][0]x;未定义行为和二维数组进行对比char arr[3][10]{apple,banana,cat}; // 二维字符数组连续内存每个字符串占10字节 char *p[3]{apple,banana,cat}; // 指针数组3个指针指向常量区字符串内存不连续数组指针类似 int(*p)[n],其含义p是一个指针专门指向一个含有n个int元素的一维数组。大小p本身就是一个指针大小32位4字节64位8字节*p代表它指向的整个数组类型是int[n]int arr[5] {1,2,3,4,5}; int (*p)[5] arr; // 取整个数组的地址 arr赋值给数组指针 printf(%p\n, p); // 数组首地址 printf(%p\n, *p); // *p等价于arr数组首元素地址 printf(%d\n, (*p)[0]); // 取数组第0个元素等价于 arr[0]易错点如果写成int*p[5]arr此时代表的是什么呢arr是数组名退化以后为指向数组内部首地址的指针此时我指向指向对象是整个一维数组所以必须加上arr取整个数组的地址这种情况下也可以理解为arr令一维数组不进行退化了不然极易混淆正确写法int(*p)[5]arr int(*p)[5]arr int(*p)arr典型用途遍历二维数组本质数组的数组int a[3][4],a是3个数组每个数组4个int#include stdio.h int main() { int a[3][4] {{1, 2, 3, 4}, {2, 3, 4, 5}, {3, 4, 5, 6}}; int (*p)[4] a; // a等价于a[0],a[0]是长度4的int数组 for (int i 0; i 3; i) { for (int j 0; j 4; j) { printf(%d, p[i][j]); } } }p[i]等价于*pi得到第i行一维数组p[i][j]访问第i行第j列元素。注意点二维数组传参//正确形参数组指针写法void fun(int(*a)[4],int row);//等价写法。形参[ ]会退化为指针void fun(int a[ ][4],int row);二维数组做函数参数必须指定列数本质就是数组指针。由行指向列一维数组。*p含义区分数组指针 int*p[5];*p 得到数组名首元素地址取值要用*p)[0],不能写成*p[0]!*p[0]等价于*p[0]),再回顾下数组指针中指针p指向的一个数组此时优先算了p[0]语法上就错误了也说不通现在指针到底指向了哪个地址。指针数组的野指针风险int *p[3]; //数组3个指针未初始化都是野指针*p[0]100; //❌崩溃没有指向合法内存字符串两种存储区别char *s[ ]{hi,hello}; //指针数组字符串在常量区不可写char s[2][10]{hi,hello}; //二维数组字符串在栈可以修改字符返回值坑不要返回局部数组的地址int* fun(){ int arr[5]{1,2,3};return arr; //❌局部函数栈销毁悬空指针 }函数当中变量都是局部变量存储在栈中随程序运行结束便销毁。数组指针也一样不能返回指向局部数组的数组指针。
返回列表