恒美微站 Logo 恒美微站
  • 首页
  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心
  • 联系我们

C语言指针知识总结

  • 首页
  • 资讯中心
  • /
  • C语言指针知识总结

相关资讯

Codex与ChatGPT合并后手机号验证问题完整解决方案 2026/9/3 8:24:59
MATLAB图像去遮挡修复系统:可复现、可调试、可教学 2026/9/3 8:19:59
MATLAB实现一维卷积神经网络(1D CNN)时间序列预测完整指南 2026/9/3 8:19:59

最新资讯

基于Python的黑悟空评论数据分析系统:从爬虫到可视化完整实战
MIT 6.002启示:如何用统一框架打通模电与数电学习壁垒
单片机毕业设计-基于单片机的水环境 TDS 与水温实时检测报警系统设计 基于 51/STM32 单片机的多水质指标采集与声光报警系统设计(018106)
去吧皮卡丘:本地部署AI角色图像生成工作流实战
Yandex全解析:从搜索语法到API接入的俄罗斯互联网生态
从“过来握手”到本地智能体:语音识别与动作执行链路搭建

今日推荐

零基础装 OpenClaw 小龙虾 AI:Windows 一键部署教程与避坑要点
Hermes Agent 本地部署新方案:Windows 整合包减少依赖报错
实测 OpenClaw 一键包,5 分钟完成本地自动化环境搭建

本周热门

备战数据库管理工程师校招:索引、事务、备份恢复核心考点解析
数字电路时序基石:深入理解建立时间与保持时间
蓝桥杯国赛超声波测距机:从单片机原理到嵌入式系统实战

本月精选

自研推理加速器Redwood:两周内实现PyTorch模型高效部署的实战教程
V4L2摄像头采集实战:从camera_client.rar到出图全流程解析
从“谁发明了钢琴键”到知识问答智能体:RAG与记忆工程实践

C语言指针知识总结

发布时间:2026/9/3 8:24:59
C语言指针知识总结 第一节 基础1.什么是指针指针是内存单元的编号。我们写下的每一个变量都会存放在内存中指针就是记录他们在内存里的位置通过指针我们也可以找到对应的数据。比如有一个整形类型的变量a他占四个字节它的指针就是他第一个字节在内存里的位置。2.指针变量和操作符1想要获得一个变量的指针变量就要用到取地址操作符比如a就拿到了a的指针变量。指针变量作为一种变量也是有类型的整形的指针变量就是int*字符的就是char*以此类推。当我们获得指针变量也可以访问存于指针变量处的数据需要用解引用操作符*假设有一个指针变量pa*pa就可以访问其中的数据。2指针的大小32位平台下地址是32个bit位指针变量大小是4个字节64位平台下地址是64个bit位指针变量大小是8个字节注意指针变量的大小和类型是无关的只要指针类型的变量在相同的平台下大小都是相同的。3指针的计算指针加减整数会跳过整数乘以去掉*号后类型的大小。指针减指针得到的是两地址相差的元素个数。4void* 指针这种类型的指针可以用来接受任意类型地址。但是也有局限性void*类型的指针不能直接进行指针的-整数和解引用的运算。第二节 深入1.const我们可以直接修改变量也可以通过指针修改变量为了安全性我们可以用const做限制。例const int n 0;现在修改n会报错但是可以通过指针修改n。int const * p可以直接改不能用指针修改指针变量可以指向其他地址。int * const p可以用指针修改但指针变量不能指向其他地址。2.野指针1野指针就是指针指向的位置是不可知的比如指针没有初始化指针越界访问指针指向空间释放都会产生野指针为了防止这种情况我们应当小心指针越界对不使用的指针赋NUL,避免返回局部变量的地址。2assert 断言assert.h头文件定义了宏 assert()它可以很好的用来判断指针是否成为野指针。assert(p !NULL);当运行到这一行代码时如果p不等于NULL,就继续运行否则就报错。3.传值调用和传址调用有的时候我们是必须要使用地址的。例如我要写一个函数这个函数可以让我输入的两个数字交换。我们可能会选择以下的写法。void Swap1(int x, int y){int tmp x;x y;y tmp;}这种写法是没有任何作用的。因为当我把数据传到函数时函数会在其他地址创造形参所以形参的改变是不影响实参的。那这个时候就可以传值调用。void Swap2(int*px, int*py){int tmp 0;tmp *px;*px *py;*py tmp;}这样是通过地址的形式间接修改内容可以达到目的。这个就是传址调用。4.地址与数据(1)数组名假设我们要取这样一个数组的地址。int arr[10] {1,2,3,4,5,6,7,8,9,10};我们之前是这样的int *p arr[0];但实际上数组名就是数组首元素的地址。将arr和arr[0]以地址的形式打印出来是一样的。但是也有例外在sizeof()里()里的arr表示的是整个数组是去计算数据的大小单位是字节。在数组名中数组名表示整个数组取出的是整个数组的地址这不同于数组首元素地址。那么整个数组的地址和数组首元素地址又有什么区别呢arr[0]和arr[0]1相差4个字节但是arr 和 arr1相差40个字节这就是它们之间的区别。(2)二级指针二级指针就是指针存放的地址。当我把一个数据存到一个地址里这个地址也会存到其他地址里面。这个其他地址的指针变量就是多级指针。(3)指针数组和数组指针指针数组int*p[ ]p先和[ ]结合。p是数组数组里面存着指针。数组指针int*p[]本质上是指针指向一个int数组。比如int(*p)[10] arr;这是它的初始化。5.字符指针变量就是char*这个指针变量用来存放字符但它有一些需要注意的地方。我们可以这么使用它char ch w;char *pc ch;也可以这么使用const char* pstr hello bit.;这并不意味着我们把hello bit.放进了pstr这个地址实际上pstr存放的是hello bit.首字符的地址。我们再来看这样的代码const char *str3 hello bit.;const char *str4 hello bit.;str3是等于str4的C/C会把常量字符串存储到单独的⼀个内存区域当几个指针指向同⼀个字符串的时候他们实际会指向同一块内存。但是用相同的常量字符串去初始化不同的数组的时候就会开辟出不同的内存块。6.函数指针变量(1)它是用来存放函数的地址的例如假设有一个Add函数我想拿到它的指针变量int Add(int x, int y){return xy;}我可以int(*pf3)(int, int) Add;int(*pf3)(int x, int y) Add;x和y可以不写我们可以这么使用它例如#include stdio.hint Add(int x, int y){return xy;}int main(){int(*pf3)(int, int) Add;printf(%d\n, (*pf3)(2, 3));printf(%d\n, pf3(3, 5));return 0;}结果是5 8(2)函数指针数组要把函数的地址存到⼀个数组中那这个数组就叫函数指针数组定义如下int (*parr1[3])();完

关于恒美微站

恒美微站专注于为个体商户、工作室提供极简自助建站服务,让每个人都能轻松拥有专业网站。

快速链接

  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心

服务项目

  • 可视化建站
  • 拖拽编辑
  • 主题定制
  • SEO 优化
  • 网站托管

联系方式

  • 📍 地址:北京市朝阳区建国路 88 号
  • 📞 电话:400-888-8888
  • ✉️ 邮箱:info@hmyw.cn
  • 🕐 时间:周一至周日 9:00-18:00

© 2024 恒美微站 hmyw.cn 版权所有 | 京 ICP 备 12345678 号