2、C语言从入门到精通一一变量

2.1、为什么需要变量

2.1.1、变量是程序的基本组成单位

不论是使用哪种高级程序语言编写程序,变量都是其程序的基本组成单位,比如:

void main(){
	int a = 1;//定义了一个整型变量,取名为a,并赋值为1(强数据类型语言)
	int b = 3;//定义了一个整型变量,取名为b,并赋值为3
	b = 89;//给变量赋值为89
	
	printf("a=%d\n",a);//使用输出语句,把变量a值输出%d表示输出的形式为整数
	printf("b=%d\n",b);//使用输出语句,把变量b值输出%d表示输出的形式为整数
	
	getchar();//将控制台停留,等待输入
}

上面代码对应的示意图:
在这里插入图片描述

2.2、变量的介绍

2.2.1、概念

变量相当于内存中一个数据存储空间的表示,你可以把变量看做是一个房间的门牌号,通过门牌号我们可以找到房间,而通过变量名可以访问到变量(值)

2.2.2、变量使用的基本步骤

1、声明变量 int num;

2、赋值 num=60;

3、使用 printf(“num=%d”,num);

4、也可以一步到位:int num2 = 99;

2.3、变量快速入门

2.3.1、变量使用入门案例

案列演示

# include <stdio.h>

void main(){
	int num1 = 1; // 整形
	double score = 2.3; // 浮点型
	char gender = 'A'; // 字符
	char name[] = "尚硅谷"; //字符串

	// 说明
	// 1.如果输出的整数 %d
	// 2.如果输出的是小数 %f.如果希望保留小数点 %.2f
	// 3.如果输出的是字符 %c
	// 4.如果输出的是字符串 %s
	// 5.在输出不同数据时,对应的格式化形式要对应起来
	printf("num=%d score=%.2f gender=%c name=%s",num1,score,gender,name);
	getchar();

}

2.4、变量使用注意事项

1、变量表示内存中的一个存储区域(不同的数据类型,占用的空间大小不一样)

扫描二维码关注公众号,回复: 10667026 查看本文章

2、该区域有自己的名称和类型

3、变量必须先声明,后使用

4、该区域的数据可以在同一类型范围内不断变化

5、变量在同一个作用域内不能重名

6、变量三要素(变量名+值+数据类型),这一点请大家注意。

7、代码演示

#include <stdio.h>

void main(){
	//1. 变量必须先声明,后使用

	// num = 10; //未定义标识符num
	// int num;

	// 2.该区域的数据可以在同一类型范围内不断变化
	int num = 90;
	// 3.变量在同一个作用域不能重名
	// 4.变量有三个要素(变量名 num2 变量值 35 数据类型:Int)
	int num2 = 35; // num不能重复定义
	num = 60;
	num = 56;

	//num = 3.4; //从double转换成Int,可能丢失数据
	printf("num = %d",num);

	
	getchar();
}

2.5、变量的数据类型

1、每一种数据都定义了明确的数据类型,在内存中分配了不同大小的内存空间(使用字节多少表示)。

2、数据类型一览图
在这里插入图片描述
3、数据类型的小结

  • 注意:在c中,没有字符串类型,使用字符数组表示字符串

  • 在不同系统上,部分数据类型字节长度不一样,int 2 或者 4

2.6、整数类型

2.6.1、基本介绍

C语言的整数类型就是用于存放整数值的,比如12,30,3456等等

2.6.2、案例演示

int num = 10;

2.6.3、整型的类型

在这里插入图片描述
在这里插入图片描述

2.6.4、整型的使用细节

1、各种类型的存储大小与操作系统、系统位数和编译器有关,目前通用的以64位系统为主。
在这里插入图片描述
2、在实际工作中,c程序通常运行在linux/unix操作系统下.二级考试,使用windows
3、C语言的整型类型,分为有符号signed和无符号unsigned两种,默认是signed
4、C程序中整型常声明为int型,除非不足以表示大数,才使用longlong
5、bit(位):计算机中的最小存储单位。byte(字节):计算机中基本存储单元。
1byte=8bit
示意图
short 3 在内存中占有2字节
int 3 在内存中占有4个字节
在这里插入图片描述
在这里插入图片描述

2.7、浮点类型

2.7.1、基本介绍

C语言的浮点类型可以表示一个小数,比如123.4,7.8,0.12等等

2.7.1、案例演示

void main(){
	double salary = 10000.56;
	double num1 = 1.3;
	double num2=4.5;
	double sum=num1+num2;
	
	printf("sum=%.2f",sum);// 5.80
	getchar();
}

2.7.3、浮点型的分类

在这里插入图片描述

2.7.4、浮点型的分类

1、关于浮点数在机器中存放形式的简单说明,浮点数=符号位+指数位+尾数位,浮点数是近视值
2、尾数部分可能丢失,造成精度损失。

2.7.5、浮点型使用细节

1、浮点型常量默认为double型,声明float型常量时,须后加‘f’或‘F’。2、浮点型常量有两种表示形式

十进制数形式:如:5.12 512.0f .512(必须有小数点)

科学计数法形式:如:5.12e2、5.12E-2

3、通常情况下,应该使用double型,因为它比float型更精确。
4、printf(“d1=%f”,d1);//在输出时,默认保留小数点6位
5、代码

#include <stdio.h>

void main(){

	// 浮点型常量默认为double,声明float型常量时,须后加'f'或'F'

	double d1 = 1.1899259949; //从“double”到“float”截断
	float d2 = 1.1f; // 1.1f就是float 
	double d3 = 1.3; //ok

	double d4 = 5.12;
	double d5 = .512; // 等价 0.512

	double d6 = 5.12e2; // 等价 5.12*(10^2) = 512
	double d7 = 5.12e-2; // 等价与5.12*(10^-2)= 5.12 / 100 = 0.0512

	// 在输出时,如果%f默认保留小数点6位  double15位
	printf("d1=%.15f d2=%f d3=%f d4=%f d5=%f d6=%f d7=%f",d1,d2,d3,d4,d5,d6,d7);
	getchar();

}

2.8、字符类型(char)

2.8.1、基本介绍

字符类型可以表示单个字符,字符类型是char,char是1个字节(可以存字母或者数字),多个字符称为字符串,在C语言中使用char数组表示,数组不是基本数据类型,而是构造类型[关于数组我们后面详细讲解.]

2.8.2、基本案例

void main(){
	char c1='A';
	char c2='0';
	char c3='\t';
	printf("c1=%cc3=%cc2=%c",c1,c3,c2);//%c表示以字符的形式输出getchar();
}

2.8.3、字符类型使用细节

1、字符常量是用单引号(’’)括起来的单个字符。例如:char c1=‘a’; char c3=‘9’;
2、C中还允许使用转义字符‘\’来将其后的字符转变为特殊字符型常量。例如:char c3=‘\n’;//’\n’表示换行符
3、在C中,char的本质是一个整数,在输出时,是ASCII码对应的字符。
4、可以直接给char赋一个整数,然后输出时,会按照对应的ASCII字符输出[97]
5、char类型是可以进行运算的,相当于一个整数,因为它都对应有Unicode码.

6、案例演示

#include <stdio.h>


void main(){

	char c1 ='a';
	char c2 ='b';
	char c3 =97; 
	// 这时当我们以%c输出时,就会按照ASCII编码表(理解 字符 <==> 数字)对应的97对应字符输出
	// 这里注意
	// 1.vs2010 编译器 是c89
	// 2.要求 变量的定义在语句之前
	int num = c2 +10; // 98 + 10 = 108

	printf("c1=%c c2=%c c3=%c\n",c1,c2,c3); // c = 'a'


	printf("num = %d",num);

	getchar();
}

2.8.4、字符类型本质探讨

1、字符型存储到计算机中,需要将字符对应的码值(整数)找出来
存储:字符’a’——>码值(97)——>二进制(1100001)——>存储()
读取:二进制(1100001)——>码值(97)——>字符’a’——>读取(显示)

2、字符和码值的对应关系是通过字符编码表决定的(是规定好)

2.9、ASCII码介绍(了解)

1、在计算机内部,所有数据都使用二进制表示。每一个二进制位(bit)有0和1两种状态,因此8个二进制位就可以组合出256种状态,这被称为一个字节(byte)。一个字节一共可以用来表示256种不同的状态,每一个状态对应一个符号,就是256个符号,从0000000到11111111。

2、ASCII码:上个世纪60年代,美国制定了一套字符编码,对英语字符与二进制位之间的关系,做了统一规定。这被称为ASCII码。ASCII码一共规定了127个字符的编码,比如空格“SPACE”是32(二进制00100000),大写的字母A是65(二进制01000001)。这128个符号(包括32个不能打印出来的控制符号),只占用了一个字节的后面7位,最前面的1位统一规定为0。

3、看一个完整的ASCII码表
在这里插入图片描述
4、缺点:不能表示所有字符。

2.10、布尔类型:boolean

2.10.1、基本介绍

1、C语言标准(C89)没有定义布尔类型,所以C语言判断真假时以0为假,非0为真[案例]
2、但这种做法不直观,所以我们可以借助C语言的宏定义。
3、C语言标准(C99)提供了_Bool型,_Bool仍是整数类型,但与一般整型不同的是,_Bool变量只能赋值为0或1,非0的值都会被存储为1,C99还提供了一个头文件<stdbool.h>定义了bool代表_Bool,true代表1,false代表0。只要导入stdbool.h,就能方便的操作布尔类型了,比如bool flag = false;[了解]

条件控制语句;if

循环控制语句;while…

2.10.2、应用案例

#include <stdio.h>

#define BOOL int
#define TURE 1
#define FALSE 0

void main(){
		
	BOOL isOk = TURE; // 等价 int isOk = 1
	int isPass = -1; // 0表示假 , 非0表示真
	if(isPass){
		printf("通过考试\n");
	}


	// 可以使用宏定义来完成(这里大家先看下,体会一下,后面我们会详解宏定义)

	// 定义一个布尔变量
	
	if(isOk){
		printf("ok");
	}

	getchar();
}

2.11、基本数据类型转换

2.11.1、自动类型转换

介绍:当C程序在进行赋值或者运算时,精度小的类型自动转换为精度大的数据类型,这个就是自动类型转换。

2.11.2、数据类型按精度(容量)大小排序为

在这里插入图片描述

2.11.3、数据类型自动转换表规则

在这里插入图片描述

2.11.4、案例演示+自动类型转换细节说明

1、有多种类型的数据混合运算时,系统首先自动将所有数据转换成精度最大的那种数据类型,然后再进行计算(如int型和short型运算时,先把short转成int型后再进行运算)。
2、若两种类型的字节数不同,转换成字节数大的类型,若两种类型的字节数相同,且一种有符号,一种无符号,则转换成无符号类型
3、在赋值运算中,赋值号两边量的数据类型不同时,赋值号右边的类型将转换为左边的类型,如果右边变量的数据类型长度比左边长时,将丢失一部分数据,这样会降低精度,丢失的部分按四舍五入向前舍入
4、代码演示

#include <stdio.h>


void main(){

	// 举例1
	char c1 = 'a';
	int num1 = c1; // ok
	double d1 = num1; //ok


	//ok
	// 举例2
	short s1 = 10;
	int num2 = 20;
	int num3 = s1 + num2 ;

	// 举例3
	float f1 = 1.1f; //ok
	double d2 = 4.58667435;
	f1 = d2; // 出现精度损失(double=>float)
	printf("f1=%.8f",f1); // 期望: 4.58667435
	getchar();
}

2.11.5、强制类型转换

  • 介绍

精度高的数据类型转换为精度小的数据类型。使用时要加上强制转换符(),但可能造成精度降低或溢出,格外要注意。

  • 强制类型转换一般格式如下:

(类型名)表达式
什么是表达式:任何有值都可以称为表达式,比如1+2,int num = 2

这种强制类型转换操作并不改变操作数本身

  • 案例演示
#include <stdio.h>

void main(){
	double d1 =1.934;
	int num = (int)d1; // 这里注意,不是进行四舍五入,而是直接阶段小数后的部分

	// 强制转换只对最近的数有效,如果希望针对更多的表达式转换,使用()
	//int num2 = (int)3.5 * 10 + 6*1.5; // 3 * 10 + 6 * 1.5 = 30+9.0 = 39.0 -> 39
	int num3 = (int)(3.5 * 10 + 6*1.5); // 35.0 + 9.0 = 44.0 -> 44
	printf("\nnum3=%d",num3);
	printf("\nnum=%d d1=%f",num,d1); // d1 仍然是double类型
	getchar();
}
  • 强制类型转换细节说明

1、当进行数据的从精度高——>精度低,就需要使用到强制转换
2、强转符号只针对于最近的操作数有效,往往会使用小括号提升优先级
3、案例演示看上面的就ok

2.12、基本数据类型转换-练习题

判断是编译是否会通过 ?

char c = ‘a’;
int i=5;
float d =.314F;
double result = c+i+d; //c+i+d类型是float->double ok

案例:

#include <stdio.h>


void main(){
	char c = 'a';
	int i = 5;
	float d = .314f;
	double d2 = 1.0;
	//double result = c+i+d; // float -> double
	char result = c+i+d; // 提示? float -> char 警告从“float”转换到“char”,可能丢失数据
	char result = c+i+d+d2; // 提示? double -> char 警告从“double”转换到“char”,可能丢失数据
}

2.13、指针入门

2.13.1、基本介绍

简单的说 指针表示一个地址(存放的是地址)

举例说明

// 讲解指针的入门

#include <stdio.h>

void main(){
	int num = 1;
	// 定义一个指针变量,指针
	//说明
	// 1.int *表示类型为 指针类型
	// 2.名称ptr ,prt就是一个int * 类型
	// 3.ptr指向了一个int类型的变量的地址
	int *ptr = &num;


	// num的地址是多少
	// 说明1:如果要输出一个变量的地址,使用格式是 %p
	// 说明2:&num 表示取出num这个变量对应地址
	printf("\nnum的值 =%d num 地址=%p",num,&num);

	// 1.指针变量,本身也有地址 &ptr
	// 2.指针变量,存放的地址 ptr
	// 3.获取指针指向的值 *ptr
	printf("\nprt的地址是 %p,ptr存放的值时一个地址 %p, ptr 指向的值=%d",&ptr,ptr,*ptr);

	getchar();
}

上面案例对应的内存布局图

在这里插入图片描述

2.13.2、指针应用案例

写一个程序,获取一个int变量num的地址,并显示到终端将num的地址赋给指针ptr,并通过ptr去修改num的值.并画出案例的内存布局图

案例演示

#include <stdio.h>

void main(){

//1.写一个程序,获取一个Int变量的num的地址,并显示到终端
//2.将num的地址赋给指针ptr,并通过ptr去修改num的值
//分析 
	//ptr的类型 就是 int * ,注意指针的类型和该指针指向的变量类型时对应关系
//3.画出案例的内存布局图


int num = 88;
int *ptr = &num;
printf("\nnum的值= %d , num的地址%p",num,&num);

*ptr = 99; // 通过ptr去改变num的,num变量的值也就响应的修改
printf("\nnum的值= %d ,num的地址%p",num,&num);*/

int a = 300; //300
int b = 400; //400
int *ptr = &a; // ok ptr的地址指向a变量
*ptr = 100; // a =100
ptr = &b; // ok ptr的地址指向b变量
*ptr = 200; //b=200
printf("a = %d b = %d prt=%d",a,b,*ptr);

getchar();

}

内存布局示意图

在这里插入图片描述

2.13.3、小练习(判断程序是否正确)

在这里插入图片描述
在这里插入图片描述

2.13.4、指针细节说明

1、基本类型,都有对应的指针类型,形式为数据类型*,比如int的对应的指针就是int*,float对应的指针类型就是float*,依次类推。
2、此外还有指向数组的指针指向结构体的指针指向共用体的指针,(二级指针,多级指针)后面我们再讲到数组、结构体和共用体时,还会详细讲解

2.14、值传递和地址传递

2.14.1、基本介绍

C语言传递参数(或者赋值)可以是值传递(passbyvalue),也可以传递指针(apointerpassedbyvalue),传递指针也叫地址传递。

1、默认传递值的类型:基本数据类型(整型类型、小数类型,字符类型),结构体,共用体。
2、默认传递地址的类似:指针、数组

2.14.2、值传递和地址传递使用特点

1、值传递:将变量指向的存储内容,在传递/赋值时,拷贝一份给接收变量.
在这里插入图片描述

2、地址传递也叫指针传递:如果是指针,就将指针变量存储的地址,传递给接收变量,如果是数组,就将数组的首地址传递给接收变量。在这里插入图片描述

3、代码演示

#include <stdio.h>

void main(){
	int num = 100;
	int *p = &num;
	int *p2 = p;
	*p2 = 55;
	printf("\nnum=%d  p=%p  p2=%p",num,p,p2);

	getchar();

}

2.15、课后练习题

1、试编写程序实现如下效果

姓名 年龄 成绩 性别 爱好
xx xx xx xx xx
要求:
a、用变量将姓名、年龄、成绩、性别、爱好存储
b、添加适当的注释
c、添加转义字符

#include <stdio.h>

void main(){
//	
//	1) 试编写程序实现如下效果
//	姓名		年龄		成绩		性别		爱好
//	xx		xx		xx		xx		xx
//	要求:
//	a、用变量将姓名、年龄、成绩、性别、爱好存储
//	b、添加适当的注释
//	c、添加转义字符
//	分析: 使用不同的变量来保存对应的数据
	
	char name[10] = "张三";
	short age = 23;
	float score = 78.5f;
	char gender = 'M';
	char hobby[20] = "篮球,足球";

	printf("姓名\t年龄\t成绩\t性别\t爱好\n%s\t%d\t%.2f\t%c\t%s",name,age,score,gender,hobby);
	getchar();


}

2、编写如下代码,并看打印效果

# include <stdio.h>

void main(){
	int number1;
	int number2;
	int number3;
	int number4 = 50;
	int number5;
	number1=10;
	number2=20;
	number3=number1+number2;//30
	printf("\nNumber3=%d",number3);//30
	number5=number4-number3;//20
	printf("\nNumber5=%d",number5);//20
	getchar();
}

3、实现两个整数的加减乘除以及取余算法
4、判断一个整数是偶数还是奇数,if第3和第4题的答案:

#include <stdio.h>

void main(){
	//************************
	//	  小小计算器
	//************************
	//10 + 5 = 15
	//10 - 5 = 5
	//10 * 5 = 50
	//10 / 5 = 2

	//分析
	//1.定义两个int
	//2.根据要求进行计算,得到不同结果,可以再定义变量

	int n1 = 10;
	int n2 = 5;
	int sum = n1 + n2;
	int sub = n1 - n2;
	int mul = n1 * n2;
	int div = n1 / n2;
	int mod = n1 % n2;
	int num = 10;
	//输出
	printf("\n************************");
	printf("\n   小小计算器");
	printf("\n************************");

	printf("\n %d + %d = %d",n1,n2,sum);
	printf("\n %d - %d = %d",n1,n2,sub);
	printf("\n %d * %d = %d",n1,n2,mul);
	printf("\n %d / %d = %d",n1,n2,div);
	printf("\n %d 模 %d = %d",n1,n2,mod);

	//  判断num 是不是偶数还是奇数
	// if-else后面要学习的分支结构,后面还会详解
	if(num%2==0){ // 偶数
		printf("\n%d是偶数",num);
	}else{
		printf("\n%d是奇数",num);
	}

	getchar();
}

5、 总结学过的命令:输入、输出、运算、存储

发布了21 篇原创文章 · 获赞 29 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/weixin_44258756/article/details/105439751