C语言指针核心精讲:数组指针/指针数组/函数指针/二级指针全覆盖

张开发
2026/4/10 8:26:32 15 分钟阅读

分享文章

C语言指针核心精讲:数组指针/指针数组/函数指针/二级指针全覆盖
本文系统梳理C语言指针核心知识点覆盖数组指针与指针数组、字符指针与字符数组、函数指针与指针函数、二级指针、常量指针/指针常量、空指针/野指针规避、void*通用指针、内存布局与动态管理等高频考点。搭配可直接运行的代码案例清晰区分易混概念详解指针在数组、字符串、函数、动态内存中的实战用法适合C语言进阶学习与面试复习。前言指针是C语言的核心与灵魂也是进阶学习的关键难点。它直接操作内存地址赋予程序高效的内存访问能力广泛用于数组、字符串、函数、动态内存管理等场景。本文基于C语言指针系统学习笔记整理数组指针/指针数组、函数指针/指针函数、二级指针、const指针、野指针防范、内存布局等核心内容辅以标准代码案例与规范排版助力快速掌握指针本质与工程用法。一、数组指针与指针数组1.1 优先级基础符号优先级**() [] ***括号优先级最高其次数组下标最后解引用1.2 数组指针本质指向整个数组的指针属于指针类型。语法数据类型 (*指针名)[元素个数];一维数组指针#includestdio.hvoidt_p1(){intarr[]{11,22,33,44,55};intlensizeof(arr)/sizeof(arr[0]);// 指向一维数组的指针int(*p)[]arr;for(inti0;ilen;i){printf(%-4d,(*p)[i]);}printf(\n);}二维数组指针#includestdio.hvoidt_p2(){intarr[][3]{{11,22,33},{44,55,66},{77,88,99}};introw_lensizeof(arr)/sizeof(arr[0]);intcol_lensizeof(arr[0])/sizeof(arr[0][0]);// 数组指针指向二维数组首行int(*p)[col_len]arr;for(inti0;irow_len;i){for(intj0;jcol_len;j){printf(%-4d,p[i][j]);}printf(\n);}}二维数组地址表示表示形式含义arr二维数组名0行首地址arr[i]第i行首地址arr[i][j]第i行第j列元素地址((arri)j)第i行第j列元素值小技巧行地址 → 列地址 → 列值1.3 指针数组本质元素为指针的数组属于数组类型。语法数据类型 *数组名[容量];#includestdio.hintmain(){inta10,b20,c30;// 指针数组每个元素是int*类型int*arr[]{a,b,c};intlensizeof(arr)/sizeof(arr[0]);for(inti0;ilen;i){printf(arr[%d] %d\n,i,*arr[i]);}return0;}1.4 数组指针 vs 指针数组对比项指针数组数组指针本质数组指针语法int *arr[5]int (*arr)[5]优先级先[]后*先()后[]用途管理多字符串、多指针二维数组遍历、行指针传递二、字符数组与字符指针2.1 两种字符串实现字符数组栈区内容可修改数组名是常量地址字符指针指向只读常量区内容不可修改指针可重定向#includestdio.h#includestring.h// 字符数组voidstr_test1(){charstr[]I LOVE C;strcpy(str,I LOVE C);printf(字符数组%s\n,str);}// 字符指针voidstr_test2(){char*strI LOVE C;strI LOVE C;printf(字符指针%s\n,str);}intmain(){str_test1();str_test2();return0;}2.2 字符串函数参数字符数组传参自动降级为char*函数内形参char str[]等价于char *str。注意字符串常量不可修改否则程序崩溃。2.3 字符串操作实现自定义strcpy#includestdio.hint_str_cpy(constchar*src,char*dest){inti0;while(src[i]!\0){*(desti)*(srci);i;}*(desti)\0;returni;}自定义字符串截取int_str_sub(constchar*src,intstart,intend,char*dest){intsrc_idx0,dest_idx0;while(src[src_idx]!\0){if(src_idxstartsrc_idxend){*(destdest_idx)*(srcsrc_idx);dest_idx;}src_idx;}*(destdest_idx)\0;returndest_idx;}三、函数指针与指针函数3.1 指针函数本质返回值为指针的函数。语法返回类型* 函数名(参数列表);禁止返回局部变量地址会产生野指针。#includestdio.hint*add(inta,intb){staticintsum;sumab;returnsum;}intmain(){int*resadd(5,3);printf(53%d\n,*res);return0;}3.2 函数指针本质指向函数入口地址的指针。语法返回类型 (*指针名)(参数类型列表);#includestdio.hintget_max(inta,intb){returnab?a:b;}intmain(){// 定义函数指针int(*p)(int,int)get_max;// 两种调用方式等价printf(%d\n,p(3,4));printf(%d\n,(*p)(3,4));return0;}3.3 回调函数实战#includestdio.htypedefvoid(*ForEachCallback)(int);typedefint(*TransformCallback)(int);voidfor_each(int*arr,intlen,ForEachCallback cb){for(inti0;ilen;i)cb(arr[i]);}voidtransform(int*arr,intlen,TransformCallback cb){for(inti0;ilen;i)arr[i]cb(arr[i]);}voidprint(intval){printf(%-4d,val);}intmul2(intval){returnval*2;}intmain(){intarr[]{11,22,33,44,55};intlensizeof(arr)/sizeof(arr[0]);for_each(arr,len,print);transform(arr,len,mul2);printf(\n变换后);for_each(arr,len,print);return0;}四、二级指针4.1 定义与用法二级指针存储一级指针地址的指针需两次解引用访问数据。语法数据类型 **指针名;#includestdio.hintmain(){inta10;int*pa;int**wp;printf(*p%d\n,*p);printf(**w%d\n,**w);return0;}4.2 二级指针与指针数组指针数组可直接赋值给同类型二级指针二维数组名是数组指针不可直接赋值给二级指针#includestdio.hintmain(){char*str_arr[]{abc,aaa,12a};char**pstr_arr;for(inti0;i3;i){printf(%s\t,*p);}return0;}五、常量指针与指针常量5.1 三种const指针常量指针const int *p指向可变数据不可改指针常量int *const p指向不可变数据可改常量指针常量const int *const p指向与数据都不可改记忆*const在*左管数据右管指针5.2 示例代码#includestdio.hintmain(){inta10,b20;// 常量指针constint*p1a;// *p1 100; 错误p1b;// 正确// 指针常量int*constp2a;*p2100;// 正确// p2 b; 错误return0;}六、野指针、空指针与空悬指针6.1 野指针定义指向非法/无效内存的指针。产生场景指针未初始化内存释放后未置空返回局部变量地址规避方案指针定义时初始化为NULLfree后立即置空不返回局部变量地址使用前判空6.2 空指针值为NULL系统保留地址不可访问free(NULL)安全不会报错6.3 空悬指针内存已释放但指针未置空仍保留原地址访问会触发未定义行为七、void 与 void*7.1 void无类型不能定义变量用于函数无返回值、无参数7.2 void*通用指针可指向任意类型数据不能直接解引用必须强转具体类型malloc/calloc返回值类型#includestdio.h#includestdlib.hintmain(){void*memmalloc(4);int*p1(int*)mem;*p1100;printf(%d\n,*p1);free(mem);return0;}八、C语言内存布局8.1 五大内存区域代码段存放函数指令只读数据段已初始化全局/静态变量.bss段未初始化全局/静态变量自动清0栈区局部变量、形参自动管理堆区动态内存手动malloc/free8.2 堆内存API函数作用初始化malloc申请n字节随机值calloc申请m*n字节自动清0free释放堆内存—注意free后必须置空指针避免空悬指针。小结本文完整覆盖C语言指针核心体系分清数组指针/指针数组、函数指针/指针函数的本质与用法掌握二级指针、const指针的声明与使用场景学会野指针/空悬指针的防范与规范写法理解void通用指针与内存布局*掌握动态内存管理能使用指针实现数组、字符串、函数回调、二维数组等常用操作指针的核心是地址与内存建议多写代码、多画内存模型。

更多文章