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

C程序设计——指针杂谈0

变量和常量讲的差不多了,这里先把指针再深入理解一下,如果你是C语言初学者,本节可能看不太懂,没关系可以以后再看。

变量

当定义变量的时候,本质是在内存中分配了一段空间,这段空间的大小与变量的类型相关,C语言中,用sizeof(),可以求出各种类型变量空间大小(字节数):

int main(void)
{int iSize ;iSize = sizeof(char);printf("sizeof(char) is          %d\r\n", iSize);iSize = sizeof(short int);printf("sizeof(short int) is     %d\r\n", iSize);iSize = sizeof(int);printf("sizeof(int) is           %d\r\n", iSize);iSize = sizeof(long int);printf("sizeof(long int) is      %d\r\n", iSize);iSize = sizeof(long long int);printf("sizeof(long long int) is %d\r\n", iSize);iSize = sizeof(float);printf("sizeof(float) is         %d\r\n", iSize);iSize = sizeof(double);printf("sizeof(double) is        %d\r\n", iSize);printf("\r\n\r\n");iSize = sizeof(unsigned char);printf("sizeof(unsigned char) is          %d\r\n", iSize);iSize = sizeof(unsigned short int);printf("sizeof(unsigned short int) is     %d\r\n", iSize);iSize = sizeof(unsigned int);printf("sizeof(unsigned int) is           %d\r\n", iSize);iSize = sizeof(unsigned long int);printf("sizeof(unsigned long int) is      %d\r\n", iSize);iSize = sizeof(unsigned long long int);printf("sizeof(unsigned long long int) is %d\r\n", iSize);printf("\r\n\r\n");iSize = sizeof(char*);printf("sizeof(char*) is          %d\r\n", iSize);iSize = sizeof(short int*);printf("sizeof(short int*) is     %d\r\n", iSize);iSize = sizeof(int*);printf("sizeof(int*) is           %d\r\n", iSize);iSize = sizeof(long int*);printf("sizeof(long int*) is      %d\r\n", iSize);iSize = sizeof(long long int*);printf("sizeof(long long int*) is %d\r\n", iSize);}

运行结果如下:

说回指针,从上面的打印,我们可以看出,在我电脑上,指针类型的长度都是8字节。在这里我可以给大家一个结论,只要计算机确定了,指针类型的长度是确定的,指针变量的长度只可能是1、2、 4、8中的一个,与内核的地址空间相关。如果地址空间不超过256字节,那么指针变量的长度就是1;如果地址空间不超过64K字节,那么指针变量的长度就是2;地址空间不超过4G字节 ,指针长度就是4字节;地址空间超过4G字节 ,指针长度就是8字节。地址空间 8字节都表示不了的计算机,目前还没有被设计出来,所以指针长度 8 字节就到头了,不可能再大了。

变量的空间是由编译器和操作系统,按照既定的算法分配的,对程序员透明,如果没有指针,程序员,就只能访问自己定义的变量,即无法访问变量以外的内存空间。

指针所能实现的需求

通常,当你做底层开发时,需要按照芯片手册,访问特定地址的数据:

STC 89C51 单片机的串口控制器

上图是STC 89C51单片机,串口控制器的寄存器列表。表格的第二行,我们可以看出:SCON是一个8位的寄存器,地址是 0x98(98H 的后缀 H,表示98是个16进制数)。如果我们要访问 SCON,肯定不能直接 char SCON,因为定义变量,不能指定 SCON 的地址。怎么办呢?有一种实现方式是(这里 volatile 超纲了,先记住这个单词,具体含义,后面再讲):

int main(void)
{/* 因为 SCON 是一个8位的寄存器,因此定义一个无符号 char 型的指针。*/volatile unsigned char *SCON;SCON = 0x98;printf("%x", *SCON);
}

 

指针定义时的一些细节

下面这个代码,定义了一个无符号 char型的指针,表示指针的 “*”,是用来修饰 “SCON”的,而不是修饰类型 “unsigned char” 。

int main(void)
{unsigned char *SCON;
}

因此下面这个代码中,SCON 是 unsigned char 类型的指针,它的长度应该是8;cC是 unsigned char 类型的变量,它的长度应该是 1 。

int main(void)
{int iSize ;unsigned char *SCON, cC;iSize = sizeof(SCON);printf("sizeof(SCON) is   %d\r\n", iSize);iSize = sizeof(cC);printf("sizeof(cC) is     %d\r\n", iSize);
}

所以上面代码的运行结果是下面这样:

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 短剧APP遭遇DDoS攻击的解决方法
  • sqlite3的db.parallelize方法:并行执行SQL语句,提升数据库操作效率
  • 网络编程 0903作业
  • Java 入门指南:Java 并发编程 —— 并发容器 ConcurrentSkipListMap
  • 航电系统,无人机的核心!!!
  • Https配置免费SSL证书
  • C++11中的constexpr
  • Linux编程--文件IO(2)、目录
  • vllm源码解析(一):整体架构与推理代码
  • Datawhale X 李宏毅苹果书 AI夏令营 入门 Task3-机器学习框架
  • vue3实现excel文件预览和打印
  • 忆恒创源发布PBlaze7 7A40系列PCIe 5.0企业级SSD,4K随机写突破百万IOPS!
  • Spring 学习笔记
  • 神经网络训练不起来怎么办(五)| Batch Normalization
  • I2C总线
  • 收藏网友的 源程序下载网
  • [iOS]Core Data浅析一 -- 启用Core Data
  • [译] 理解数组在 PHP 内部的实现(给PHP开发者的PHP源码-第四部分)
  • 10个最佳ES6特性 ES7与ES8的特性
  • 2017 年终总结 —— 在路上
  • C++类的相互关联
  • co模块的前端实现
  • CSS中外联样式表代表的含义
  • golang中接口赋值与方法集
  • Js实现点击查看全文(类似今日头条、知乎日报效果)
  • js数组之filter
  • KMP算法及优化
  • Spring技术内幕笔记(2):Spring MVC 与 Web
  • Terraform入门 - 1. 安装Terraform
  • uni-app项目数字滚动
  • vue自定义指令实现v-tap插件
  • webgl (原生)基础入门指南【一】
  • webpack4 一点通
  • 代理模式
  • 对JS继承的一点思考
  • 互联网大裁员:Java程序员失工作,焉知不能进ali?
  • 前端之Sass/Scss实战笔记
  • 如何用vue打造一个移动端音乐播放器
  • 实习面试笔记
  • 腾讯优测优分享 | 你是否体验过Android手机插入耳机后仍外放的尴尬?
  • 微服务核心架构梳理
  • 新版博客前端前瞻
  • 用jquery写贪吃蛇
  • k8s使用glusterfs实现动态持久化存储
  • mysql面试题分组并合并列
  • 宾利慕尚创始人典藏版国内首秀,2025年前实现全系车型电动化 | 2019上海车展 ...
  • # Kafka_深入探秘者(2):kafka 生产者
  • #include<初见C语言之指针(5)>
  • #Linux(权限管理)
  • #数据结构 笔记一
  • (5)STL算法之复制
  • (CPU/GPU)粒子继承贴图颜色发射
  • (Java入门)学生管理系统
  • (void) (_x == _y)的作用
  • (二十六)Java 数据结构