P 21 小结和内容梳理 2022/8/21
一、总结
- 数据类型的种类,需要记住
- 整型的具体类型和使用细节
P 22 浮点数介绍和使用细节2022/8/21
一、基本介绍
#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();
}
二、浮点类型
三、浮点型使用细节
-
浮点型常量默认为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();
}
P 23 字符型介绍和使用细节2022/8/21
一、基本介绍
#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();
}
二、字符类型细节使用
// 这时我们以%c输出时,就会安装ASCII编码表(理解 字符<==> 数字 对应关系)对应的97,对应字符输出
char c3= 97;
int num = c2 + 10;
printf("c1=%c c2=%c c3=%c\n",c1,c2,c3); // 对照ASCII编码表知,c= 'a'
三、字符类型本质
四、ASCII基本了解
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程序在进行赋值或者运算的时,精度小的类型自动转换为精度大的数据类型,这就是自动类型转换。
数据类型按精度(容量)大小排序为:
案例演示:
#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
一、基本介绍
代码演示以及案例:(其中解析及其原理是非常重要的)
// 指针的入门
#include<stdio.h>
void main(){
int num = 1;
// 定义一个指针变量,指针
// 说明1: int * 表示类型为指针类型
// 说明2: 名称 ptr, ptr 就是一个int * 的类型
// 说明3:ptr 指向了一个int 类型的变量地址
int *ptr = #
// 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
一、案例操作
代码演示:
#include<stdio.h>
void main(){
//1) 写一个程序,获取一个int变量num的地址,并显示到终端
//2) 将num的地址赋给指针 ptr , 并通过ptr去修改num的值.
// 分析: ptr 的类型是int *, 不是float *;注意指针的类型和该指针指向的变量类型是对应关系(取决于指针指向的是怎样的一个变量)
//3) 并画出案例的内存布局图
int num = 88;
int *ptr = #
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();
}
二、指针练习
// 题目一:
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) 默认传递地址的类似:指针、数组
二、值传递和地址传递使用特点
小解析:相当于把藏宝图*p
塞在快递里寄给别人,别人想要宝藏100就先要拿到快递,拿到快递后还要根据藏宝图去找宝藏
代码演示:
#include<stdio.h>
void main(){
int num = 100;
int *p = #
int *p2 = p;
*p2 = 55;
printf("num=%d *p=%d *p2=%d",num,*p,*p2); // 此时应该输出3个55
getchar();
}