常量
- 定义:描述一些固定的数据,不能改变的数据
- 常量的分类:
- 整型常量
- 二进制
- 八进制
- 十六进制
- 实型常量
- 单精度float
- 双精度double
- 字符型常量
- char
- 字符串常量
- 用双引号引起来的就是字符串常量
- 整型常量
#include <stdio.h>
int main() {
// 整型常量
10;
// 实型常量(小数)
// 单精度float/双精度
// 注意默认情况下都是双精度的实型常量也就是所有小数都是默认double
10.1; // 双精度double
88.8; // 双精度double
5.2f; // 单精度float
// 字符型常量,用单引号扩起来的就是字符型常量
// 注意:字符型常量只能写一个字符,写多个会报错除了\r,\n,\t,\f,\\,\',\'',\ddd
'a'; // 字符型常量
'ab'; // 错误
'1';
‘12’;
‘1’; // 这个是么?
// 字符串型常量,用双引号引起来的就是字符串常量
// 注意:无论你用双引号l括起来几个字符,只要是使用双引号扩起来就是字符串常量
"abc";
"a"
return 0;
}
变量
-
什么是变量
-
表示的数据可以经常被修改,当一个数据的值不确定,或者经常被修改的时候就应该用变量来表示
-
比如说:游戏积分,页码
-
-
如何定义变量
-
申请一块存储空间,也就是定义一个变量
-
定义变量的格式,数据类型,变量名称
-
定义一个基本数据类型的变量(int,float,double,char)
-
int number; // 定义一个n名称叫做number的变量,会在内存空间中开辟一块给number,用于存储数据 int value; // 再开辟一块空间给value
![image-20200506235143526](/Users/mac/Library/Application Support/typora-user-images/image-20200506235143526.png)
-
连续定义变量
int number1,number2; // 连续开辟两个存储空间分别给number1,number2
-
如何往变量对应的存储空间中存储数据呢?
注意:变量中不能随便的存储数据,只能存储与之对应的数据,也就是说之前申请内存空间为int类型,那就只能存储int类型,如果存储float,double会出一些问题
int number; number = 2; // 这时候会把数据2这个值放在申请好了的number的存储空间中
-
变量的第一次赋值称之为初始化
- 要想使用变量都必须先对变量进行初始化,然后才能使用
- 如果不对变量进行初始化,那么其实变量存储的就是一些垃圾数据
-
如何使用变量
-
要使用占位符
-
int number = 10; printf("%i",number);
-
-
变量初始化的两种方式
// 初始化的两种方式 // 1,先定义再初始化赋值 int value1; value1 = 10; // 2,定义的同时初始化 int value2 = 10;
-
完全初始化
// 完全初始化 int value3, value4; value3 = value4 = 10; // 把10赋值给value4,再把value4的值赋值给value3 int value3,value4; value4 = 10; value3 = value4;
-
部分初始化
// 部分初始化 int value5,value6 = 10; // 开辟两个存储空间value5,value6,将10的值赋值给value6,但是value5并没有给赋值
-
如何修改变量的值
int number = 10; // 定义并初始化一个变量number,将10的值赋值给number number = 20; // 将20的值赋值给变量number,此时number的内存空间没有是10,只有20了。它只能存一个值
-
变量之间的值传递
int number = 10; // 定义并初始化一个变量number,将10的值赋值给number int number1 = number; // 将number的值赋值给number1,此时会先去找number这个变量的内存地址,找到内存地址取出存的值,将这个值赋值给number1
-
连续赋值
int a,b,c; // 定义并初始化三个变量a,b,c a = b = c = 10; // 将10的值赋值给c,再将c的值赋值给b,再将b的值赋值给a
-
如何查看变量的值(简单用法)
// int类型 int number = 10; printf("number的值是%i",number) //使用%i // float类型 float FloatNumber = 20.0f; // float类型要加上f标示,默认是double类型的 printf("FloatNumber的值是%f",FloatNumber) // 使用%f // double类型 double DoubleNumber = 30.01234567890; printf("DoubleNumber的值是%lf",DoubleNumber) //使用lf,longfloat printf("DoubleNumber的值是%.10lf",DoubleNumber) // printf函数默认强制输出小数点后6位,想要输出双精度的需要指定你要输出小数点后面几位 // char类型 char CharNumber = 'a'; printf("CharNumber的值是%c",CharNumber) // 使用%c
变量的作用域
-
c语言中所有变量都有自己的作用域,根据作用域的不同分为局部变量和全局变量。
int main(){ a = 10; int a ; // 变量的作用域是从定义的哪一行开始,到大括号结束,报错 return 0; // return 代表函数的结束,只要执行到这里就代表这个函数结束了 }
-
例如:把变量放在rerurn后面执行--报错
int main(){ int number; number = 10; return 0 ; printf("%i",number); // 此时number在return的后面,number的作用域也就消失了 }
-
例如:不同函数之间的变量作用域是不一样的,不能相互调用的
int call(){ int number; return 0; } int main(){ number = 10; printf("%i",number); // 此时在main函数中调用call函数中的变量number,会报错。number在call函数中,他的作用域之存在于call的函数内存空间中。 return 0; }
-
例如:在同一函数中,函数的嵌套时,内层函数可以使用外层函数的变量,外层函数不能使用内层函数的变量
int main(){ int number; { number = 10; printf("%i",number);// 此时可以正常打印,外层中number时遇到她所在的内存空间,他和{printf("%i",number)}是同一级别的 } return 0; }
int main(){ { int number; number = 10; } printf("%i",number); // 此时是错误的,number的变量存储在{}中,并不在main()函数中 return 0; }
-
例如:变量查找的顺序(第一种)
- 如果自己的作用域中有就使用自己的
- 不同的作用域中可以定义相同的变量名称
- 统一范围内不能出现同名的变量
int main(){ int number; { int number = 20; printf("%i",number); // 20,变量名称相同,先查找本内存空间的变量number也就是20 } printf("%i",number); // 0,因为在此内存空间中有number的变量,但是并没有初始化所以是0,也可能是其他的数字,随机的 return 0; }
-
变量的内存分析
-
内存和字节的关系
- 每块内存都是连续的
- 每块内存的大小都是一样的
- 合理的分配内存会节省很多空间
-
一个变量所占用的内存空间,不仅跟变量的类型有关系,还跟编译环境有关系
-
同一个变量类型在不同的编译环境下所占用的存储空间是不一样的-这就是我们要定义变量类型的原因(优化存储空间)
-
内存由大到小寻址
// 内存空间分析 int main(){ // 内存寻址从大到小,按照这种规则那么先定义的变量内存地址肯定比后定义的要大 int number = 0; int value = 0; printf("number的内存地址是%p\n",&number); // 使用%p占位符,&符号就可以获取变量的内存地址,打印出来的是16进制 //a, b, c, d, e, f //10, 11, 12, 13, 14, 15 printf("value的内存地址是%p\n",&value); return 0; }
-
变量存储单元的第一个字节地址就是该变量的地址
-
任何变量在存储空间都是二进制存在的
-