一、变量的特点及作用域 1、变量的特点 1)创建一个变量相当于在内存中占用了一块空间。 2)这个空间的大小是固定的,但里面的护具可以改变。 3)同一个作用域内不能有相同的变量名。 4)初始化时创建,在函数作用域执行完成后失效,且内存空间释放。 2、作用域特点: 1)不同函数属于平行作用域,平行作用域没有干扰。 2)同一个函数下的作用域可以有多个嵌套,子作用域内部创建变量跟外部没有关系,但是可以用外部的变量(就近原则)。 3)子作用域定义的变量,只在本作用域内有效,在父作用域内是用不了的。 //变量的作用域 int main() { int num; //如果此处变量的定义被注释掉,则会提示未定义变量“num” num = 2; { int num = 3; num = 4; //就近原则,并没有改变外部num的值 printf("内部num是:%d\n",num); } printf("外部num是:%d\n",num); return 0; } 输出==>内部num是:4 外部num是:2 二、变量的内存分析 1、内存的基本单位是byte(字节),每一块字节都有地址(可以理解为名字)。 2、变量创建后就占用了一片固定内存空间。 3、不同类型的数据变量在不同编译环境下的占用内存空间大小是不一样的。
见附件1 4、输出内存占用:printf(“char类型在当前环境占用字节数为:%lu”,sizeof(char)); 5、变量创建后会分配一个地址(就是其占用的第一个字节的地址)。 6、输出内存地址的方法:int num;printf(“%p\n”,&num); 7、内存由地址从大到小寻址,有限分配内存地址较大的字节给变量。 8、在变量未经初始化赋值之前,不要使用变量的值。(没有意义)。 9、补充: 1)lu表示长整型。 2)int a :变量内存分配与赋值与否没有关系。 3)sizeof(数据类型)是一个关键字,也是一个单目操作符,打印占位用lu。 4)size用于计算当前环境下占用的内存字节数。 //交换两个变量的值 int main() { int a = 8; int b = 10; int temp; printf("交换前的变量为:%d,%d\n",a,b); temp = a; a = b; b = temp; printf("交换后的变量为:%d,%d\n",a,b); return 0; } 10、所有程序占用同一块内存区域,创建一块内存空间时分配的地址,当销毁后(结束),再创建一块内存空间时分配的地址,不一定会继续上一次的地址往下分配,因为同时开启的程序很多,也许被另外一个程序占用了下面的地址。 11、首字节的地址就是变量的地址,而且连续定义的三个变量,之间相差4个字节(16位编译环境为相差2个字节)。 三、scanf()函数
1、scanf()函数是什么? C语言下的scanf()函数是样式化输入函数,由C语言自带的库提供。 2、scanf()函数有什么用? 可以按用户指定的格式从键盘上把数据输入到指定的变量之中。 3、scanf()函数怎么用? 1)#include <stdio.h> 引入头文件,表示在这个文件里要用到里面的scanf()函数。 2)scanf(“格式化字符串”,变量地址);如,int a;int b; scanf(“%d,%d”,&a,&b); 3)格式化规定字符,以”%”开始,后跟一个或几个规定字符。 4)常用:%d 整数 %f浮点数 %c单个字符 %s字符串 %p指针的值。 4、scanf()函数什么时候用? 当你想通过外部输入数据赋值到程序变量的时候。 5、scanf()函数由什么特点? 1)可以单个或批量输入,但两个%%之间的分割内容必须按原样输入。 2)格式化字符串不能用\n作换行,直接回车就可以表示结束并自动换行。 四、基本运算 见附件2 1、算数运算是什么? “+”加法运算符、“-”减法运算符、“*”乘法运算符、“/”除法运算符、“%”取余运算符 2、算数运算有什么用? 数据运算。 3、算数运算怎么用? 直接在两个数之间加符号就可以了,如1 + 1,2 – 1,3 * 1,4 / 2 ,5 % 2 4、算数运算什么时候用? 当你想进行数据运算时候。 5、算数运算有什么特点? 1)不同数据类型精度不一样,double>float>int,取余运算符只能整数。+1:正数 -1:负数。 2)若用高精度向低精度变量赋值,会丢失今年高度,如int a = 1.8;那么a值是1(非四舍五入)。 3)运算优先级是,从左到右,但:+ - * / % =,如果要人为改变则加( )。 4)运算时两个数据精度不一样,会自动类型转换,且是低精度向高精度转换。 5)同精度运算只能得到同精度的结果,如果需要提高精度,需要强制类型转换。 6、补充 1)当想要输出%的时候,可以连续输入两个%,转义成一个%。 2)高精度向低精度转换会丢失精度,但是低精度向高精度转换会自动提升精度。 3)强制类型转换不会提示警告 int a = (double)1.4; 4)4 % 6,即4 / 6取余数,当两个数取余时,如果要取余的数“4”小于被取余的数“6”,结果就是要取余的数“4”本身。 |