java 变量作用域 c语言_C语言深入理解 - 常量与变量
++++++++++++++++++++++++++++++++++++++++++
《C语言深入理解系列 - 常量与变量》
查看其它博文请关注原创作者。
本文系本站原创,欢迎转载! 转载请注明出处:
++++++++++++++++++++++++++++++++++++++++++
常量与变量
正所谓静中有动,动中有静,常量与变量亦是如此,它们之前相互依赖,相互影响。关于常量与变量,很多朋友可能觉得没有什么好介绍的,它实在是太简单了,单从字面上看就知道什么意思?我想说的不是关于常量与变量的概念,而是其深入的实质。
其实很多朋友在学到后面指针的时候经常会出现,段错误,晕指针(我对那些指针恐惧者的症状叫法),野指针等问题,都是因为对常量和变量的理解不够深入,基础理解不够踏实。
常量:其值不会发生改变的量,称为常量。它们可以和数据类型接合起来分类。比如:整形常量,浮点型常量,字符常量等等,常量是可以不经过定义和初始化,而直接引用的。
常量分类:常量又分为:直接常量和符号常量。
直接常量又叫做:字面常量。如12,0,4.6,’a’,”abcd”
符号常量:如宏定义的:#define PI 3.14
特点:常量的值在其作用域内不会发生改变,也不能再被赋值。其在出现时就被当作一个立即数来使用。也就是说,只能被访问,被读,而不能被写,被赋值。
其实,你一旦声明了一个常量,那么常量所在的内存空间就被加上了只读的属性,它有点类似于const关键字。
变量:其值在其作用域内可以改变的量称为变量。一个变量应该有一个名字,在内存中占据一定的存储空间。变量在使用前必须要定义。每个变量都有自己的地址。
变量分类:变量依据其定义的类型,分为不同类型,如:整型变量,字符型变量,浮点型变量,指针型变量等等。
特点:变量其值可以发生改变,意味着它可以被覆盖,被写入,被赋值。每个变量必须要有一个名字和它所在内存空间绑定,如图xxx所示。
图xxx 变量内存空间示意图
代码中声明整型变量a,它的类型已经决定,那么它的大小也就是4个字节(32位机上),那么在内存中就有连续的四个字节与之对应,a变量名就代表了这四个字节的空间,a变量的地址就是连续四个字节的开始的地址0x000。就好像是饭店里每个房间都有一个地址,如201室代表二楼每一个房间,叫201不太雅观,我们起个名字叫:牡丹厅。那么,我们人为的将“牡丹厅”这个名字和201房间绑定在了一起。当我们说到牡丹厅,就知道是201房间,同样当我们说201房间我们也知道是牡丹厅。
同样的道理,当我们说a变量,就知道是从0x000这个地址开始的4个字节,当我们说0x000地址就知道这是a变量的空间。那么既然a是变量也就是说它所代表的空间里的数据是可以修改的,同样0x000地址处的数据也是可以修改的。
变量名和变量的值:
变量名是在变量的声明的时候,该名字就和内存中一块地址绑定在一起了。可以通过变量名直接找到对应的内存区域,也可以通过地址找到其内存区域。
变量的值是变量所对应的内存区域内存放的二进制序列。变量的值不会因为变量的类型发生了改变而改变,当变量被转换为对应类型时,内存区域的二进制序列以该类型的形式翻译出来。这也是强制类型转换能够成立的原因。
例如:
int a = 97;
char ch1 = ‘a’;
char ch2 = (char)a;
char *p = (char*)a;
第一行代码:整型变量a在内存中是以97的二进制形式存放的,当使用它时,会被以十进制形式表现出来。
第二行代码:字符变量ch1的ASCII 码是97,也是以97的二进制存放的,使用时,会被以字符’a’的形式表现出来。
第三行代码:将整型变量a强制类型转换成字符型,a变量里的值没有变,变的是它的类型,它里面的值还是97的二进制,它类型变成了char,97的二进制变成char型,表现出来就是字符’a’。
第四行代码:声明一个字符型指针变量p,p是个变量,它里面的值可变,它的值是整型变量a的值强制类型转换成了字符指针类型。这个时候p里的值还是97的二进制,只不过这个97的意义已经代表了一个字符型指针,也就是一个指向字符的地址了。
由此可见:变量在内存中存放和它的值没有关系,而是和它的类型相关的。同样我们也可以得出:一个二进制序列对于计算机本身而言没有任何意义,计算机根本不知道这个二进制数据是干什么的,只有具体到它的类型时或出现在合适的场合时,才能代表具体的意义。如果一串二进制数据出现在地址总线上,它代表是一个地址,如果该相同数据出现在数据总线上,它代表是一个数据。所以,当我们看到一个数据时,比如:3.1415926,不能把它戴上定向思维的帽子认为它就是PI,而是要看清它的本质,它就是一堆二进制代码。
我们来看下下面的例子:
1.
char ch = ‘a’;
int a = (int)ch;
printf(“%d %c\n”, a, ch);
ch是什么?ch里装的是什么?a是什么?a里面装的是什么?打印什么?
2.
int add = 0x12345678;
int *p = (int*)add;
add是什么?add里装的是什么?p是什么?p里装的是什么?*p又是什么?&p又是什么?
3.
#define PI 3.14
int a = PI;
printf(“%d\n”, a);
上面的代码有没有问题?
4.
#define PI 3.14
printf(“%d\n”, PI);
代码有没有问题?
5.
#define PI 3.14
int a = PI;
PI = 3.1415926;
int b = PI;
printf(“%d %d\n”, a, b);
代码有没有问题?
6.
char *str = “hello world”;
printf(“%s\n”, str);
*str = “goodbye world”;
printf(“%s\n”, str);
代码有没有问题?
答案:
1. 测试对变量类型的理解和类型转换。ch是字符型变量,ch里是字符’a’的二进制数,a是整型变量,a里面是字符’a’的二进制数的整型表示方式,以十进制数表示出来97。打印结果为97 和 a。
2. 测试对整型和地址类型转换。add是一个整数变量,add里是0x12345678的二进制数,以十进制表现出来,p是一个整型指针变量名,p里面是0x12345678的二进制数,以地址的方式表现出来,代表地址0x12345678。*p是通过*去访问地址0x12345678这个地址处的数据(如果你试图去打印它,会出错,因为这个地址你不一定有权限去访问)。&p是取出整型指针变量p的地址,因为p是一个变量,它也有自己的地址,所以可以取出它的地址来(见上面变量的定义)。
3. 宏定义一个常量PI,PI这个符号代表了3.14,在代码执行前的预处理阶段第二行int a = PI,已经被替换为了int a = 3.14,将3.14赋值给整型,会舍弃掉小数点后面部分结果,仅保留整数部分,打印结果为3。
4. 和上面3一样,在预处理阶段被替换成了printf(“%d\n”, 3.14),结果为1374389535,这是因为将浮点型的3.14在内存中的数据,以整型来表现的。
5. 第三行PI = 3.1415926会出错,PI是个常量其被替换成了3.14 = 3.1415926,3.14是个字面常量,不能被赋值。错误信息为“向无效左值赋值出错”(关于常见错误信息,见C语言常见错误详解章节)。
6. 第三行*str = “goodbye world”出错,第一行中将字符串常量“hello world”的首地址给了字符指针变量str,第三行试图将“goodbye world”的首地址,通过*str的访问方式覆盖str指向的字符串常量“hello world”。这句话理解起来都比较费劲,因为这里有两个错误:
试图向常量里写数据。
“hello world” 是字符串常量,那么这个字符串空间里的内容不能改变。
指针变量里应该放地址,字符串都是以首地址为地址。
向一个地址里写入字符串应该使用strcpy。*str只是代表了str指向的字符串中的第一个字符,将字符串地址写入到一个字符里肯定不行。
关于上面说的,可能现在还不太好理解,请读者通读完C语言指针和数组之后再来细品,定会有不同程度的深入理解。
++++++++++++++++++++++++++++++++++++++++++
《C语言深入理解系列 - 常量与变量》
查看其它博文请关注原创作者。
本文系本站原创,欢迎转载! 转载请注明出处:
++++++++++++++++++++++++++++++++++++++++++
java 变量作用域 c语言_C语言深入理解 - 常量与变量相关推荐
- C语言笔记(三)常量、变量
作者:老余 博客地址www.yuxiaoshao.cn 联系方式qq:1316677086 有问题或者有错误请下方直接评论 常量 如果看官是在这个博客里来查资料的,那就不要来了,这里是放的我对本章内容 ...
- 电子英汉词典c语言程序设计报告,英汉电子词典设计报告_设计_C语言_C语言程序设计.doc...
英汉电子词典设计报告_设计_C语言_C语言程序设计 课程设计 课程名称 :C语言程序课程设计 题目名称 :电子英汉词典 学生学院 :电气信息学院 专业班级 :自动化1101 学 号 :20110102 ...
- c语言根据变量作用域不同分为,C语言中不同变量的访问方式
8种机械键盘轴体对比 本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选? C语言中的变量大致可以分为全局变量,局部变量,堆变量和静态局部变量,这些不同的变量存储在不同的位置,有不同的生命周期.一 ...
- C语言入门(4)——常量、变量与赋值
对于基本数据类型量,按其取值是否可改变又分为常量和变量两种.在程序执行过程中,其值不发生改变的量称为常量,其值可变的量称为变量.它们可与数据类型结合起来分类. 常量 常量有字符常量(Character ...
- char类型怎么输入 c语言_C语言零基础入门到精通视频课程(精品)
C语言入门 C语言一经出现就以其功能丰富.表达能力强.灵活方便.应用面广等特点迅速在全世界普及和推广.C语言不但执行效率高而且可移植性好,可以用来开发应用软件.驱动.操作系统等.C语言也是其它众多高级 ...
- C语言-----标识符、关键字、常量、变量
这篇文章主要对C语言的标识符.关键字.常量.变量的一些细致知识点进行详细的讲解. 比如:1.标识符的命名规范,也就是常量.变量.函数名的命名规则进行规范的讲解.2.C语言的关键字列表.3.常量的定义及 ...
- 大整数减法c语言_C语言学习笔记(一)
第一节 头文件 #include<stdio.h> ->编译预处理文件 注释 单行注释的使用 -> // 多行注释的使用 -> / 注释内容 / 定义函数 函数首部 in ...
- bool c语言_C语言面试54题
C语言面试54题 大家好,这期呢,我们谈一下c语言的面试题. 第1题,c语言有哪些核心的特征? 可移植性很强. 模块化能力很强. 灵活性很高. 加载速度和执行速度都很好. 可扩展性很强. 第2题, ...
- window直接运行不需要环境的软件是什么语言开发的_C语言为何不会过时?你需要掌握多少种语言?_C 语言...
01为什么C语言不会过时 评价任何一门编程语言,都是招人骂的.永远是这样.就像是春寒料峭的季节, 街上穿棉袄和穿单衣的擦肩而过,双方一定是同时在心里出现了两个字:"s b!"这个在 ...
最新文章
- 如何使用OWASP Dependency Check的命令行(CLI)模式进行依赖库安全漏洞扫描
- 线性代数第五版吉尔伯特课后答_线性代数同济第五版第四章课后习题答案!
- 常识:佛前三炷香是什么意思
- TCP三次握手建立连接的过程
- 免费当天澳洲运营商全天下载量达1841TB
- **ML : ML中的最优化方法
- mac os和linux和安卓,在我的安卓手机里,安装Windows和macOS系统
- c语言计算火车的运行时间_C++火车入轨算法的实现代码
- Linux 启动文件、设置环境变量的位置
- 大数据技术应用需注意哪些问题
- 【优化算法】天牛须搜索优化粒子群算法【含Matlab源码 1256期】
- 精通JavaScript--06设计模式:结构型
- 希尔密码_密码学中的希尔密码
- 操作系统进程调度实验
- TensorFlow Serving Introduction
- Java实验二 货物进销管理系统【简单易懂】
- torch.bmm 函数
- EasyUI的datagrid分页,动态隐藏或显示列
- 高速数字电路AC耦合电容HFSS仿真
- 员工与客户之间就是一个微信
热门文章
- 北理计算机教案,北理工版三年级信息技术教案重点.docx
- numpy 转置_Numpy基础:数组转置和轴对换
- nacicat for mysql查询_navicat for mysql怎么用
- linux 测试cpu计算圆周率_Linux下测试CPU性能
- python计算PR曲线sklearn.metrics.precision_recall_curve
- QT环境配置:QT5.8.0与VS2013环境配置
- PyTorch框架学习十五——可视化工具TensorBoard
- 小甲鱼 OllyDbg 教程系列 (十四) : 模态对话框 和 非模态对话框 之 URlegal 和 movgear
- 王爽 汇编语言第三版 第7章 --- 更灵活的定位内存地址的方法(可以理解为 数组形式的内存定位)
- Linux 输入输出重定向 2>/dev/null和>/dev/null 2>1和2>1>/dev/nul