核心内容摘要
国产一区:探索中国影像力量的崛起与未来
C语言指针详解最清晰、最完整的入门到进阶指南指针是 C 语言中最强大、最重要、也最容易出错的核心特性。
一句话
总结指针就是“地址的变量”它存储的是另一个变量或内存块的内存地址通过指针可以“间接访问”和“操作”那块内存。
下面从零基础到高级一步步把指针讲透。
指针最基础的概念必须死记inta10;// 普通变量值是 10int*pa;// p 是一个指针变量存的是 a 的地址// 三行最核心的理解printf(%d\n,a);// 输出 10 变量的值printf(%p\n,a);// 输出地址如 0x7ffdf1234568printf(%p\n,p);// 输出地址和 a 相同printf(%d\n,*p);// 输出 10 通过指针“解引用”得到的值最关键的三个符号每天默写 10 遍直到刻进 DNA符号含义读法中文英文说法取地址运算符“取地址”address-of operator*
定义指针类型
解引用取值“指针类型” / “解引用”pointer declaration / dereference*p通过指针 p 访问它指向的内存的值“p 指向的值”value pointed by p一句话记忆口诀 是“去哪找”是“找来干什么”*
指针变量的定义方式最容易混淆的地方inta10;int*p1a;// 推荐写法* 紧跟变量名int*p2a;// 也可以但容易误导int*p3,q;// p3 是指针q 是普通 int最常出错int*p4,*p5;// p4 和 p5 都是指针正确正确记忆*是跟变量走的不是跟类型走的所以永远写成int *p而不是int* p这样定义多个变量时才不会出错。
指针的各种常见类型必须掌握指针类型定义写法指向的内容大小步长典型用途指向基本类型int *psizeof(int) 通常 4操作单个 int 变量指向数组int arr[10]; int *p arr;同上遍历数组最常见指针数组int *arr[10];—每个元素都是指针数组指针int (*p)[10];整个数组大小指向整个数组多维数组常用指向函数的指针int (*func)(int,int);—回调函数、函数表void 指针void *p;无步长不能 通用指针malloc 返回的就是 void*
指针的经典用法面试 实战必会
1 指针遍历数组最常见写法intarr[5]{10,20,30,40,50};int*parr;// 数组名就是首元素地址for(inti0;i5;i){printf(%d ,*(pi));// 方式1指针 偏移// 或printf(%d ,p[i]);// 方式2像数组一样用 []本质相同// 或printf(%d ,*p);// 方式3指针自增最简洁但注意顺序}
2 交换两个变量不用第三变量voidswap(int*a,int*b){inttemp*a;*a*b;*btemp;}// 调用intx5,y10;swap(x,y);// 必须传地址
3 动态内存分配malloc / calloc / realloc / free#includestdlib.h// 分配一个 int 大小的内存int*p(int*)malloc(sizeof(int));if(pNULL){/* 分配失败处理 */}*p100;// 分配 10 个 int 的数组int*arr(int*)malloc(10*sizeof(int));// 分配并清零int*arr2(int*)calloc(10,sizeof(int));// 全初始化为 0// 扩容很重要int*new_arr(int*)realloc(arr,20*sizeof(int));if(new_arr)arrnew_arr;// 释放必须成对free(p);free(arr);parrNULL;// 防止野指针现代推荐C99用sizeof(*p)而不是sizeof(int)int*pmalloc(sizeof(*p));// 更安全类型改了也不用改代码
指针最容易犯的致命错误面试 生产必考解引用空指针Segmentation faultint*pNULL;*p10;// 崩溃使用后释放Use After Freeint*pmalloc(sizeof(int));free(p);*p20;// 未定义行为重复释放Double Freefree(p);free(p);// 崩溃或内存损坏野指针int*p;// 未初始化*p10;// 随机地址极度危险数组越界intarr[5];*(arr
999;// 越界写破坏内存防御式编程黄金准则所有指针初始化为 NULLfree 后立刻置 NULL使用前永远判断 !NULL永远用sizeof(*p)而不是硬编码类型
面试最常考的指针笔试题背熟这些基本能过指针关指针 1 到底加了多少int*p;// 加 4int 4 字节char*q;// 加 1double*r;// 加 8*p、(*p)、*p、p区别写一个函数返回两个数的最大值和最小值用指针实现字符串复制不调用 strcpy用指针实现二维数组动态分配const 指针 vs 指针 const 的四种写法
总结指针的本质一句话指针就是地址的变量通过它可以“隔空操控”内存C 语言把内存管理权完全交给程序员所以指针强大但也最容易出错。
现代 C 项目中“指针不离手但别裸奔”—— 能用数组用数组能用结构体用结构体指针主要用来做参数传递、动态内存、遍历和底层操作。
想继续深入哪个指针专题A. 指针面试经典 20 题详解B. const 与指针的四种组合const int*、int* const 等C. 指针数组 vs 数组指针完整对比 多维数组写法D. 动态内存分配的完整案例链表、哈希表E. 野指针、悬垂指针、内存泄漏的真实