嵌入式学习day15
指针部分概总C语言指针核心笔记一、指针基础1. 指针的本质指针是存储内存地址的变量其核心作用是间接操作内存空间解决函数内无法修改外部变量、动态管理内存等问题。2. 指针的定义语法// 格式数据类型 * 指针变量名;inta10;int*pa;// *表示定义指针变量取变量a的地址赋值给p数据类型决定指针解引用时访问的内存大小如int*解引用访问4字节char*访问1字节指针变量名存储目标变量的内存地址。3. 指针的大小32位系统所有指针大小为4字节地址总线32位64位系统所有指针大小为8字节地址总线64位指针大小与指向的数据类型无关仅与系统位数相关。4. 指针的访问方式访问方式语法说明直接访问a 20;直接通过变量名操作内存间接访问*p 20;通过指针解引用操作内存解引用*的执行步骤取出指针变量中存储的内存地址从该地址偏移sizeof(数据类型)字节定位内存空间操作该内存空间读/写。5. 野指针与NULL野指针未初始化的指针存储随机地址直接解引用会导致内存非法访问NULL定义为#define NULL (void*)0是无效地址用于初始化指针避免野指针int*pNULL;// 合法空指针解引用前需检查6. 指针运算符与算术运算运算符作用取地址变量→地址*解引用地址→变量指针算术运算规则p N/p - N地址偏移N * sizeof(数据类型)字节p/p--地址逐次偏移1个数据类型大小p - q仅同类型指针有效结果为地址间的元素个数无pq/p*q/p/q指针比较基于地址大小//等仅同类型指针比较有意义。二、指针与一维数组1. 数组名与指针的等价性数组名本质是数组首元素的地址常量不可修改因此inta[10]{1,2,3};int*pa;// 等价于 int *p a[0];2. 指针访问数组元素指针方式*(p i)访问第i个元素下标方式a[i]等价关系a[i] *(a i) *(i a) i[a]后两种仅语法合法无实际意义。三、指针与字符串1. 字符串的两种存储形式形式示例可修改性内存位置字符数组char s[] hello;可修改栈字符串常量char *s hello;不可修改只读区2. const与指针核心语法形式含义const char *s/char const *s指针指向的内容不可修改*s只读char * const s指针变量本身不可修改s只读const char * const s指针变量指向的内容均不可修改应用场景字符串函数参数用const char*避免函数内修改输入字符串。3. 常用字符串函数手动实现核心逻辑函数功能核心逻辑strlen计算字符串长度不含’\0’遍历字符串直到’\0’统计字符数strcpy字符串拷贝遍历src逐字符拷贝到dest最后补’\0’strncpy限定长度拷贝拷贝前n个字符未拷贝满n则补’\0’strcat字符串拼接先定位dest的’\0’再从该位置拷贝src的字符strcmp字符串比较逐字符比较ASCII值返回第一个不同字符的差值0相等0s1s20s1s2四、指针与二维数组1. 二维数组的内存本质二维数组是数组的数组如int a[3][4]是3个int[4]类型的一维数组内存中连续存储。2. 数组指针指向一维数组的指针// 定义数据类型 (*指针变量名)[一维数组长度];inta[3][4]{1,2,3,4,5,6,7,8,9,10,11,12};int(*p)[4]a;// p指向包含4个int的一维数组3. 二维数组的指针访问核心等价关系a[i][j] *(*(a i) j) *(p[i] j) p[i][j]4. 字符型二维数组 vs 指针数组// 1. 字符二维数组栈内存可修改chars1[3][10]{hello,world,china};char(*p1)[10]s1;// 数组指针指向含10个char的数组// 2. 指针数组存储字符串常量地址不可修改字符串内容char*s2[3]{hello,world,china};char**p2s2;// 二级指针指向char*类型的指针五、动态内存分配1. 核心函数需包含stdlib.h函数功能示例malloc分配指定字节的内存未初始化int *p (int*)malloc(10*sizeof(int));calloc分配n个size字节的内存初始化为0int *p (int*)calloc(10,sizeof(int));realloc重新分配内存扩展/缩小p (int*)realloc(p, 20*sizeof(int));free释放动态分配的内存free(p); p NULL;2. 注意事项动态内存分配在堆区需手动free释放否则内存泄漏free后必须将指针置NULL避免野指针void*指针需强制类型转换后解引用如*(int*)p。六、函数指针1. 定义语法// 格式返回值类型 (*指针变量名)(参数列表);intadd(inta,intb){returnab;}int(*pfunc)(int,int)add;// pfunc指向add函数2. 核心应用回调函数// qsort排序示例自定义比较函数intcompar(constvoid*a,constvoid*b){return*(int*)a-*(int*)b;// 升序排序}intarr[]{3,1,2};qsort(arr,3,sizeof(int),compar);七、特殊场景1. 返回指针的函数字符串函数如strcpy/strcat返回char*便于链式调用如strcat(strcpy(dest, src1), src2)。2. main函数的参数intmain(intargc,constchar*argv[]){// argc命令行参数个数至少为1argv[0]是程序名// argv字符串数组存储命令行参数}八、指针核心总结指针的核心是地址操作解决“间接修改变量、动态管理内存、数组/字符串灵活操作”问题指针使用三要素明确指针指向谁、指针的目标类型、避免野指针/内存泄漏关键等价关系数组下标↔指针偏移、二维数组↔数组指针、字符串↔char*const修饰指针需区分“修饰内容”还是“修饰指针本身”动态内存必须“申请-使用-释放”闭环函数指针是回调机制的核心。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2431860.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!