C语言 | 第三章 | 变量 指针入门 强制转换 布尔类型

P 21 小结和内容梳理 2022/8/21

一、总结

  • 数据类型的种类,需要记住
  • 整型的具体类型和使用细节

P 22 浮点数介绍和使用细节2022/8/21

一、基本介绍

image-20220821161752687

#include<stdio.h>
void main(){
	double salary = 10000.56;
	double num1 = 1.3;
	double num2 = 4.5;
	double sum = num1 + num2;
	printf("sum=%.2f",sum);
	getchar();
}

image-20220821161814970

二、浮点类型

image-20220821153156020

三、浮点型使用细节

  • 浮点型常量默认为double型 ,声明float型常量时,须后加‘f’或‘F’。

  • 浮点型常量有两种表示形式 :

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

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

  • 通常情况下,应该使用double型,因为它比float型更精确。

  • printf("d1=%f ", d1); // 在输出时,默认保留 小数点6位

#include<stdio.h>
void main(){
	   // 浮点型常量默认为double型 ,声明float型常量时,须后加‘f’或‘F’。
	float d1 = 1.1f;  // 从“double”到“float”截断,说明是double类型
	float d2 = 1.1f; // 1.1f 就是float 类型
	double d3 = 1.3; // ok

	double d4 = 5.12;
	double d5 = .512; // 等价于0.512,前面默认是0

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

	// 在输出时,如果%f没有些保留多少位,默认保留小数点6位;保留15位则是%.15f
	printf("d1=%f d2=%f d3=%f d4=%f d5=%f d6=%f d7=%.15f",d1,d2,d3,d4,d5,d6,d7);
	getchar();
}

image-20220821155255987

P 23 字符型介绍和使用细节2022/8/21

一、基本介绍

image-20220821170919717

#include<stdio.h>
void main(){
	
	char c1 = 'a';
	char c2 = 'b';
	// 这时我们以%c输出时,就会安装ASCII编码表(理解 字符<==> 数字 对应关系)对应的97,对应字符输出
	char  c3= 97; 
	int num = c2 + 10;
	printf("c1=%c c2=%c c3=%c\n",c1,c2,c3);   // 对照ASCII编码表知,c= 'a'
	
	// 这里注意
	// 1.vs2010 编译器 是 c89
	// 2.要求变量的定义在语句之前,所有执行语句之前

	printf("num=%d",num); //	c2对应的是b,ASCII中b对应98,所以输出应为98+10=108
	getchar();
}

二、字符类型细节使用

image-20220821172244258

	// 这时我们以%c输出时,就会安装ASCII编码表(理解 字符<==> 数字 对应关系)对应的97,对应字符输出
	char  c3= 97; 
	int num = c2 + 10;
	printf("c1=%c c2=%c c3=%c\n",c1,c2,c3);   // 对照ASCII编码表知,c= 'a'

三、字符类型本质

image-20220822090743766

四、ASCII基本了解

image-20220822091157958

P 24 布尔类型介绍和使用 2022/8/22

一、基本介绍

  • C语言标准(C98)没有定义布尔类型,所以C语言判断真假时以0为假,非0为真,如下:
#include<stdio.h>
void main(){
	int isPass = 1;  // 0 表示假,非0表示真
	if(isPass) {
	printf("通过考试");
	}
	getchar();
}
  • 但是上面这种做法不直观,所以我们可以借助C语言的宏定义
#include<stdio.h>

// 宏定义
#define BOOL int  	// 可以使用宏定义来完成(体会一下 即可,后面详解)
#define TRUE 1
#define FALSE 0
void main(){
	// BOOL isOK = TRUE; // 等价于int isOK = 1,FALSE等价于0,
	BOOL isOK = FALSE;
		// 定义一个布尔变量

	if(isOK){
		printf("ok"); // TRUE显示OK,FALSE反之
	}
	getchar();

}
  • 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

P 25 数据类型自动转换 2022/8/22

一、自动类型转换

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

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

image-20220822105618760

案例演示:

#include<stdio.h>

void main(){
	char c1= 'a';
	int num1 = c1; // ok 
	double d1 = num1; //ok
}

二、自动类型转换细节说明

  • 有多种类型的数据混合运算时,系统首先自动将所有数据转换成精度最大的那种数据类型,然后再进行计算(如:int型和short型运算时,先把short转成int型后再进行运算)。
#include<stdio.h>
// 案例二
void main(){
	short s1 = 10;
	int num2 =20;
	int num3 = s1 + num2;
}
  • 若两种类型的字节数不同,转换成字节数大的类型,若两种类型的字节数相同,且一种有符号,一种无符号,则转换成无符号类型

  • 在赋值运算中,赋值号两边量的数据类型不同时,赋值号右边的类型将转换为左边的类型,如果右边变量的数据类型长度比左边长时,将丢失一部分数据,这样会降低精度,丢失的部分按四舍五入向前舍入

#include<stdio.h>

void main(){
	//案例三
	float f1 = 1.1f;
	double d2 = 4.58667435;
	// 数据类型不同时,赋值号右边的类型将转换为左边的类型
	f1 = d2	;  //  右边变量数据类型长度比左边长度大,则会出现精度损失(float<-double )
	printf("f1=%.8f",f1);  // 期望 4.58667435,使用double f1 = d2 则不会出现精度缺失
	getchar();	
}

P 26 数据类型强制转换 2022/8/23

一、强制类型转换

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

#include<stdio.h>
void main(){
	
	double d1 = 1.234;
//	int num = d1;  // 编译器会警告:从“double”转换到“int”,可能丢失数据
	int num = (int)d1; // 当加上强制转换符(),就不会有任何警告
								// 不会进行四舍五入,而是直接截断小数后的部门
	printf("num=%d",num);
	getchar();
}

强制转换一般格式如下:

(类型名) 表达式;什么是表达式: 任何有值都可以称为表达式,比如 1+ 2, int num = 2; 这种强制类型转换操作并不改变操作数本身

二、强制转换细节说明

  • 当进行数据的从 精度高——>精度低,就需要使用到强制转换
  • 强转符号只针对于最近的操作数有效,往往会使用小括号提升优先级
#include<stdio.h>
void main(){
	// 强制转换只对最近的数有效,如果希望针对更多的表达式转换使用 ()
	int num2 = (int)3.5 * 10 + 6 * 1.5; // 3 * 10 + 6 * 1.5 = 39.0
	int num3 = (int)(3.5 * 10 + 6 * 1.5);   // 括起来后针对整个括号 35.0 + 9.0 = 44.0,无警告	
	printf("num2=%d\n",num2);
	printf("num3=%d",num3);
	getchar();
}

三、题目测试

#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 + d2;  // 警告 double --> char  
}

P 27 指针入门和内存布局 2022/8/23

一、基本介绍

image-20220823111010572

代码演示以及案例:(其中解析及其原理是非常重要的)

// 指针的入门
#include<stdio.h>

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

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

	// 1. 指针变量 ,本身也有地址 &ptr ; 
  	// 地址不是一直不变的,而是动态变化的,但是存放的地址与对应变量地址始终相同(保持他们之间的指向是一致的就可以了)。
	// 2. 指针变量,存放的地址 ptr
	// 3. 获取指针指向的值 *ptr
	printf("\nptr的地址是 %p ptr 存放的值是一个地址 %p ptr指向的值=%d",&ptr,ptr,*ptr);

	getchar();
}

P 28 指针应用案例 2022/8/23

一、案例操作

image-20220823215207213

代码演示:

#include<stdio.h>

void main(){
//1) 写一个程序,获取一个int变量num的地址,并显示到终端
//2) 将num的地址赋给指针 ptr , 并通过ptr去修改num的值.
// 分析: ptr 的类型是int *, 不是float *;注意指针的类型和该指针指向的变量类型是对应关系(取决于指针指向的是怎样的一个变量)
//3) 并画出案例的内存布局图

	int num = 88;
	int *ptr = &num;
	printf("\nnum的值=%d num的地址=%p",num,&num); // num = 88
	*ptr = 99; // 获取指针指向的值 *ptr,通过ptr去修改num的值,num变量的值也就相应被修改。
	// 分析: ptr里面存放的是num变量的地址,*ptr才是取出这个地址(也就是num的地址)所对应的值88,然后改变这个值为99。
	printf("\nnum的值=%d num的地址=%p",num,&num); // num = 99
	getchar();
}

二、指针练习

image-20220823220840006

// 题目一:
void main(){
	
	int a= 300;
	int *ptr = a;
// 错误:因为a是int类型,下面是int * ,需要的是一个地址值,所以在a前面加上&就行了
}

// 题目二:
void main(){
	
	int a = 300;
	float *ptr = &a;
// 错误:把int的一个地址赋给了float*
}

// 题目三:
void main(){
	int a =300;  // a = 300 
	int b= 400; // b =400
	int *ptr = &a;  // ok  ptr存放的地址指向了a变量
	*ptr = 100;
	ptr = &b;	
	*ptr =200;
	printf("\n a=%d,b=%d,*ptr=%d",a,b,*ptr);
	getchar();
	// 分析结果: a = 100 ,b = 200, *ptr = 200
}

P 29 指针的注意事项和细节 2022/8/23

一、指针细节说明

  • 基本类型,都有对应的指针类型, 形式为 数据类型 ,比如 int的对应的指针就是 int *, float* 对应的指针类型就是 float * , 依次类推

  • 此外还有指向数组的指针指向结构体的指针指向共用体的指针,后面我们再讲到数组、结构体和共用体时,还会详细讲解。

P 30 值传递和地址传递 2022/8/24

一、基本介绍

C语言传递参数(或者赋值)可以是值传递(pass by value),也可以传递指针(a pointer passed by value), 传递指针也叫地址传递。

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

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

image-20220824094505787

image-20220824100335276

小解析:相当于把藏宝图*p塞在快递里寄给别人,别人想要宝藏100就先要拿到快递,拿到快递后还要根据藏宝图去找宝藏

代码演示:

#include<stdio.h>

void main(){

	int num = 100;
	int *p = &num;
	int *p2 = p;
	*p2 = 55;

	printf("num=%d *p=%d *p2=%d",num,*p,*p2); // 此时应该输出3个55
	getchar();
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一颗星星辰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值