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

C语言-指针

一. 指针的概念

指针的用途:高效的访问数据
特征:
高效,简洁(相对于普通变量而言)。
指针可以直接访问物理内存,或者直接操作硬件。(单片机开发)。


内存地址:计算机需要对物理内存进行管理。因为内存空间大,给每个存储单元(1byte)分配一个编号。这个标号就被称为内存地址。


指针:就是指针变量。专门用来存储内存地址的变量。在32位系统中,任意类型的指针大小为4byte (0-0xffffffff)。64位系统中任意类型的指针大小为8byte.(0-0xffffffffffffffff).

指针的类型是多种多样:int*(整形的),char*(字符指针),double*(浮点类型指针)。任意类型的指针大小都是一致。 用指针可以表示任意的数据。



相关的运算符:
&:取地址运算符。获得变量在内存空间中的地址编号。

单目运算符,从右向左结合。

被操作对象,只能是变量。不能是常量,或这表达式。
int a =20;
&a; //获得a变量在内存中的地址。需要输出时应使用%p打印地址。

*:解引用操作符。对地址进行解引用操作。

int main() { int a = 66; char c = 'z'; printf("&a is %p,&a size is %lu\n",&a,sizeof(&a));//整形指针 printf("&c is %p,&c size is %lu\n",&c,sizeof(&c));//字符指针 printf("a = %d\n",*&a);//解引用操作,对象必须是指针 printf("c = %c\n",*&c); return 0; }

二. 指针的定义与初始化

int main() { int* pi;//只能指向整形变量的地址 char *pc;//野指针 double *pd = 0;//空指针 float *pf = NULL;//空指针,逻辑上先指向地址为0处的空间,稍后给一个合理的 //地址 int a = 10; pi = &a;//正常初始化 return 0; }

注意:1、指针也是有类型的

2、在定义指针时,同时初始化为NULL或者0,防止野指针。

野指针:成因:1、指针未初始化,指向的内存地址随机

2、指针指向的变量内存空间被释放

三. 指针的访问

直接访问变量的内容称为直接访问。

使用指针访问变量的内容称为间接访问。

int main() { int a = 0, b = 0, ret = 0; int *pa = &a, *pb = &b; printf("input two number:"); scanf("%d %d",pa,pb); //使用指针完成加减乘除 ret = *pa + *pb; printf("a + b = %d\n",ret); ret = *pa - *pb; printf("a - b = %d\n",ret); ret = *pa * *pb; printf("a * b = %d\n",ret); ret = *pa / *pb; printf("a / b = %d\n",ret); return 0; }

四. 指针的运算操作

int main() { int a = 0, b = 0; int *pa = &a, *pb = &b; printf("&a = %p,&b = %p\n",pa,pb); printf("&a - 1 = %p\n",pa-1); //pb - pa 指向两个不同变量的指针,相减无意义 //pa = pa * 2, pa = pa / 2 指针的相乘相除都无意义 // int arr[10] = { 0 }; int *p1 = &arr[0], *p2 = &arr[9]; int ret = p2 - p1;//在同一数组中,指针减指针得到的是两个指针之间的元 //素个数 printf("p2 - p1 = %d\n",ret); return 0; }

对于同一数组来说,指针减指针得到的是两个指针之间的元素个数:

相当于:(p1 - p2) / sizeof(基类型)

4.1 不同类型的指针的解引用操作

指针的类型决定了在使用解引用操作时访问几个字节的大小。比如 int* 类型的指针解引用时可访问4个字节,char* 类型的指针在进行解引用操作时可访问1个字节
如果执行*解引用操作话。假设指针存储的地址是0x2000,则不同类型的指针的解引用有如下操作结果:

char*,取0x2000 开始的1个字节空间的数据

int*,取0x2000 开始的4个字节空间的数据

short*,取0x2000开始的2个字节空间的数据

f1oat*,取0x2000 开始的4个字节空间的数据

double*,取0x2000 开始的8个字节空间的数据


4.2 不同类型的指针的++,--


如果执行++。假设指针存储的地址是0x2000,则不同类型的指针的解引用有如下操作结果:

char*,偏移量 1byte -> 0x2001

int*,偏移量 4byte -> 0x2004

short*,偏移量 2byte -> 0x2002

f1oat*,偏移量 4byte -> 0x2004

double*,偏移量 8byte -> 0x2008

五. 大小端存储方式

大端存储方式:数据的低字节存储在高地址,高字节存储在低地址

小端存储方式:数据的低字节存储在低地址,高字节存储在高地址

大小段存储方式,是由CPU 决定。51单片机,网络设备,都使用大端方式储存数据。

AMD,intel,ARM,都是采取小端存储。

int main() { int a = 1; char *p = (char*)&a;//强制类型转换 if(*p == 1) printf("小端存储\n"); else printf("大端存储\n"); return 0; }
http://www.jsqmd.com/news/797903/

相关文章:

  • 号易企业知识库:2026 年 5 月 15 日起,邀请码 666666 开放新权限(重大公告) - 号易官方邀请码666666
  • CCNet:十字交叉注意力如何重塑语义分割的上下文建模
  • 保姆级教程:手把手教你用微信小程序+路由器搞定远程开机(WOL),告别NAS/台式机耗电
  • AI时代,程序员如何自救?非程序员如何入局?高薪岗位+副业项目全解析!
  • 维普AIGC90%改稿降不动?率零句式结构重构,AI率降到5%以内! - 我要发一区
  • 小红书去水印免费软件有哪些?电脑版手机版都能用的去水印工具2026实测推荐 - 爱上科技热点
  • 别再死记硬背TL431外围电路了!手把手教你用Python+Tina-TI搞定开关电源反馈环路设计
  • Neo4j图数据库实战:从入门到精通的Cypher查询指南
  • 视频去水印不收费工具推荐,亲测好用,操作简单效果出色 - 爱上科技热点
  • JimuReport积木报表SQL数据集配置避坑指南:从字段映射到分页预览的完整流程
  • 工程师幽默文化:从工程恶作剧看团队创意与伦理边界
  • [STM32U3] 【STM32U385RG 测评】 开箱+FreeRTOS点灯
  • 2026年4月双片钉箱机企业推荐分析,双片钉箱机企业 - 品牌推荐师
  • 如何在没有iCloud 备份的情况下从iPhone恢复联系人
  • A*算法在传教士与野人过河问题中的启发式设计与状态空间搜索实践
  • 哈尔滨市香坊区万物物联电子产品服务中心:对讲机批发销售维修一站式专业服务商 - 黑龙江单工科技
  • 告别手动计算!用MATLAB R2023b和Vivado 2023.2的FIR IP核,5分钟搞定FPGA滤波器设计
  • 别光知道bitwise_and!用OpenCV Python玩转图像抠图与区域提取的3个实战技巧
  • 免费查AI率怎么用最划算?5款0元查AIGC工具组合,毕业论文不花钱! - 我要发一区
  • 从Git合并到家族树:聊聊LCA算法在真实世界里的那些“神操作”
  • 五月十一日晚上
  • 免费下载百度文库、道客巴巴等30+文档平台:kill-doc文档下载脚本完全指南
  • SpringBoot文件上传临时目录失效:从异常定位到系统级根治方案
  • 视频水印能不能彻底消除 新手也能学会的技巧 - 爱上科技热点
  • 视频去水印软件哪个好用?2026年视频去水印软件排行榜与好用工具全面推荐 - 爱上科技热点
  • 从医学到金融:用Python实战Cox比例风险模型进行企业风险预测(附完整代码)
  • 数据标注平台搭建:支持主动学习的智能标注工具
  • 维普AI率90%怎么办?率零2元/千字句式重构,深度重灾区救命! - 我要发一区
  • 小红书视频怎样无水印保存?2026最新去水印工具推荐与实用方法指南 - 爱上科技热点
  • 3个核心功能解锁你的B站视频永久保存方案