当前位置: 首页 > news >正文

Days 11 易混指针学习笔记

前言

指针是 C 语言最难、最核心的知识点,前期学数组、函数传参都会和指针挂钩,整理课堂全部指针内容,概念 + 语法 + 代码逻辑一次性梳理清楚,避开野指针、空指针、地址传递等新手高频坑。

一、指针基础概念

1. 地址

计算机给内存每个字节空间分配唯一编号,这个编号就是地址;内存按字节编址,所有变量、数组、代码都存在对应地址空间里。

2. 指针

指针本质就是内存地址,地址等价于指针;指针自带类型,类型决定访问内存时读取多少字节数据。

3. 指针变量

专门用来存放内存地址的变量,日常说的 “指针” 大多指代指针变量。

二、指针两大核心运算符

1. & 取地址运算符

  1. 作用:获取变量在内存中的首地址;
  2. 使用限制:只能作用于左值(普通变量、数组元素),常量、表达式不能取地址;
  3. 类型变化:普通 int 变量取地址后变为int *指针类型;
int num = 10; # // 获取num变量的内存首地址

2. * 解引用 / 取值运算符

  1. 作用:拿到指针存储的地址,访问该地址对应的内存数据;
  2. 使用限制:只能作用于指针类型,普通变量不能直接用 *;
  3. 类型变化:int *指针解引用后变回普通 int 类型;
  4. 可做左值:*p = 100代表修改指针指向空间的值;
int a = 20; int *p = &a; *p = 666; // 修改a的值为666

三、指针变量定义规则

1. 标准定义格式

数据类型 *变量名; // 示例 int *p; // 指向int类型空间的指针 char *p; // 指向char类型空间的指针 float *p; // 指向float类型空间的指针 double *p; // 指向double类型空间的指针 // 同时定义多个指针,每个变量前都要加* int *p1, *p2;

2. 关键特性:所有指针变量占用空间大小统一

不管是 int、char、double*,所有指针变量都占 8 字节,指针类型只决定解引用时读取字节数,不改变指针自身存储空间。

3. 野指针

  • 定义:未初始化的指针、指向已经释放 / 销毁空间的指针;
  • 风险:野指针存储随机地址,对野指针*解引用会造成程序崩溃;
  • 规范:定义指针必须初始化,杜绝野指针。

4. 空指针 NULL

  1. 定义:指向内存地址0x0的指针,用宏NULL表示;
int *p = NULL;
  1. 注意:0x0 地址是系统只读保护区域,禁止对空指针解引用*p,运行直接崩溃;
  2. 用途:初始化指针、判断指针是否有效。

5. 不同类型指针含义

表格

写法含义
int *p指针指向一块 int 大小的内存空间,解引用一次读取 4 字节
char *p指针指向 char 空间,解引用读取 1 字节
float *p指针指向 float 空间,解引用读取 4 字节
double *p指针指向 double 空间,解引用读取 8 字节

四、指针两种操作含义

假设有int a = 100; int *p = &a;

  1. p:操作指针变量本身,修改 p 的值等于修改指针的指向;
  2. *p:操作指针指向的内存空间,不会改变 p 存的地址,只会修改 a 里面的数据。

指针赋值示例

int a = 100, b = 200; int *p = &a; int *q = &b; p = &b; // 修改指针p,让p指向b p = q; // 把q存储的地址拷贝给p,p和q同时指向b *p = b; // 将b的值写入p指向的空间(b覆盖a) *p = *q; // 把q指向的数据赋值给p指向的空间

五、指针算术运算

指针只能做+、-、++、--、指针相减,不能做乘除运算。

  1. p++:向内存高地址偏移,偏移字节数 = 指针对应数据类型字节数
    • int* p++ 向后偏移 4 字节;char* p++ 向后偏移 1 字节
  2. p--:向内存低地址偏移对应类型字节;
  3. *p++等价(*p), p++:先取 p 指向的值,再让指针后移;
  4. 两个同类型指针相减:结果是两个地址之间相差元素个数,不是字节数。

六、指针做函数参数(地址传递核心)

1. 值传递 vs 地址传递

  1. 值传递:实参拷贝数值给形参,形参是副本,修改形参无法影响外部实参;
  2. 地址传递:把实参的内存地址传给指针形参,函数内通过*形参直接操作外部变量,能修改实原值;
  3. 核心用途:利用地址传递,实现函数同时返回多个修改结果

示例:交换两个数字(不用指针无法实现)

#include <stdio.h> void swap(int *x, int *y) { int temp = *x; *x = *y; *y = temp; } int main() { int a = 10, b = 20; swap(&a, &b); // 传入地址,地址传递 printf("a=%d b=%d",a,b); return 0; }

七、一维数组与指针深度关系

1. 数组名本质

数组名a指向数组首元素的指针常量,等价于&a[0]

int a[5] = {1,2,3,4,5}; int *p = a; // 等同于 int *p = &a[0];

2. 数组下标和指针完全等价

plaintext

a[n] == *(a + n) == *(p + n) == p[n]

原理:[]只是语法糖,底层全部转换为指针偏移解引用。

3. 数组名不能当成普通指针的两种场景

  1. sizeof(a):计算整个数组占用总字节,不会退化为指针;
  2. &a:取整个数组的地址,类型是数组指针,不是元素指针。

八、一维数组传参三种写法(底层全是指针)

数组传参本质只传递首元素地址,数组长度需要额外传参:

int a[10]; // 写法1:数组形式 int fun(int array[], int len); // 写法2:固定长度数组(无实际限制,仅语法) int fun(int array[10], int len); // 写法3:标准指针形式(推荐) int fun(int *parray, int len);

九、新手指针避坑总结

  1. 指针必须初始化,未初始化是野指针,严禁直接解引用;
  2. 空指针 NULL 不能做*解引用操作,程序直接崩溃;
  3. 值传递改不了外部变量,想要修改必须传地址(指针参数);
  4. 数组名是指针常量,不能写a = p;给数组名重新赋值;
  5. 指针加减偏移量看自身类型,char每次移 1 字节,int每次移 4 字节;
  6. 所有指针变量自身都是 8 字节,区别只在解引用读取的数据宽度;
  7. *p++优先级:先取值,再移动指针,不要写成(*p)++
  8. 数组传参只会传首地址,函数内无法用 sizeof 获取数组真实长度,必须手动传入 len。
http://www.jsqmd.com/news/1305282/

相关文章:

  • 映泰TB250-BTC主板BIOS魔改实战:让老主板支持8代9代CPU
  • 2026 年 Java 程序员必备!这款 Gitee 28000+ Star 的开源框架,帮你拿下大厂 Offer
  • Claude 5模型深度解析:从核心能力到工程实践的成本优化指南
  • 没考CCAA外审员会错过什么?2026年三体系审核员职业价值分析——众智商学院 - 众智商学院cppm官方
  • FreeMove终极指南:3步解决C盘空间不足,程序迁移不再损坏
  • Qt模态与非模态对话框:事件循环原理与实战避坑指南
  • 天津地区北京字画回收实力厂家怎么选?2026年行业观察与机构分析 - 优质品牌商家
  • Android Room数据库实战:从SQLite痛点解析到架构设计最佳实践
  • 飞书表格下拉列表应用与高级配置指南
  • 校招广撒网投递简历反馈低,该如何优化简历匹配度?
  • 如何快速掌握Dark Reader:智能暗黑模式浏览器的完整使用指南
  • 有没有免费插件能替代Office自带的那些功能?比如自动编号什么的。
  • Vite + ant-design-vue 打包体积与开发体验优化实战
  • 2026年陕西建工人才培训认证榜单:三类人员考试题库/建筑特种工/电工证/注册建造师培训及中高级工程师评审一站式服务机构推荐 - 优企名品
  • 2026河南钢结构加固工程公司十大实力榜,避坑优选不踩雷 - 工业推荐榜
  • 2026 年当下,南山口碑好的笼车托运公司推荐几家,运大件的它竟能省出近千元,这招90%的人都不知道? - 行业鉴选官
  • 京东评论接口实战指南:从官方 API 接入到评论数据深度分析
  • 番茄同城小程序:电商闭环搭建难场景下的开源实践笔记
  • 2026摇盘包膜一体机选购指南:行业实操选型、故障排查与常见答疑
  • 【AI简历变现实战指南】:20年HR技术专家亲授7天打造高转化模板,附3个已验证月入过万案例
  • 9.基于 ABAP Open SQL 联表查询实现采购订单金额计算与交互式 ALV 报表开发
  • 工作流引擎Activiti核心概念与实战:从BPMN到流程变量管理
  • 石墨烯匹克球拍有哪些销售厂家,如何找到这些厂家?
  • Matplotlib图形显示控制:show、close、draw函数深度解析与实战
  • 2026年知名的开关用弹性合金供应商实力公司推荐 - 工业推荐榜
  • 2026 年新发布:六安正规的精密无缝钢管厂家哪家靠谱,机器零件的耐用密码,竟藏在这不起眼的“无缝铁管”里?-静德钢管 - 企业推荐官【认证】
  • Facebook广告预算增加后为什么效果下降?扩量过程中有哪些常见问题?
  • 东莞锡渣回收怎么选?2026年深圳供货商综合评估指南 - 优质品牌商家
  • CPPM报名费用8800元到底包含什么?2026年每一项费用明细拆解——众智商学院张明老师权威解读 - 众智商学院cppm官方
  • 老板想自己看数据为什么这么难-角色视角才是数据决策的入口