1.变量
1.1整数类型
1.1.1介绍
C语言中整数类型用于存放整数。例如int a =10
1.1.2整数类型的分类
类型名称 | 大小 | 值范围 |
char | 1byte | -2^7到2^7-1 |
short | 2byte | -2^15到2^15-1 |
int | 4byte | -2^31到2^31-1 |
long | 4byte | -2^31到2^31-1 |
- C语言中的整形类型分为signed和unsigned,其中默认为signed,上表为signed
- C程序中整形常声明为int
1.2浮点类型
1.2.1介绍
C语言中浮点类型用于存放小数。例如float a = 7.3
1.2.2浮点类型的分类
类型 | 存储大小 | 范围 | 精度 |
float | 4byte | 1.2e-38到3.4E+38 | 6位小数 |
double | 8byte | 2.3E-308到1.7E+308 | 15位小数 |
- 浮点数=符号位+指数位+尾数位(浮点数可以理解为近似值)
- 尾数部分可能会造成丢失,导致精度损失
- float变量需要在后面加上f
- %f默认默认6位小数 %.x保存x位小数
-
#include<stdio.h> void main() { float a1 = 7.32f;//float变量需要在后面加上f double a2 = 6.23213213211;//%f默认默认6位小数 %.x保存x位小数 double a3 = .97;//等价于0.97 double a4 = 9.7e2;//等价于9.7*10^2 printf("a1=%f a2=%f a2=%.15f a3=%f a4=%f", a1, a2, a2, a3, a4); }
1.3字符类型
1.3.1介绍
字符类型为char,大小为1byte,可以存储字母或者数字。
1.3.2代码![](https://i-blog.csdnimg.cn/blog_migrate/9e5af63e7bd60036af0e81c2dca4b8c2.png)
#include<stdio.h>
void main() {
char c1 = 'a';//字符常量需要用两个单引号括号起来
char c2 = 'b';
char c3 = 97;//若对char赋值一个整数,它将会输出其对应的的ASCII码的字母或者符号
printf(" c1 = %c c2 = %c c3 = %c", c1, c2, c3);
int c4 = c2 + 40;//char类型可以进行运算
printf(" c4 = %d", c4);
char c5 = 'A';
printf(" c5 = %c", c5);
}
- 字符常量需要用两个单引号括号起来
- 若对char赋值一个整数,它将会输出其对应的的ASCII码的字母或者符号
- char类型可以进行运算
- 存储:字符'a'→'a'ASCII码值(97)→(97)对应二进制数(1100001)→存储
- 读取:二进制数(1100001)→(1100001)对应十进制数(97)→(97)对应ASCII码'a'→读取
1.4布尔类型
- C89标准中,需要用宏定义方式定义布尔变量,且bool变量中非0即为真 0即为假
#include<stdio.h> #define BOOL int #define TURE 1 #define FALSE 0 void main() { //BOOL isOK = TURE; BOOL isOK = FALSE; if (isOK) { printf("true"); }else { printf("false"); } }
- C99下,提供了bool类型,但是与C89不同的是,仅存在0为假,1为真(C89下非0即为真),但是需要导入头文件stdbool.h
#include<stdio.h> #include<stdbool.h> void main() { bool c1 = false; if (c1) { printf("true"); } else { printf("false"); } }
- bool通常用于条件控制语句if,循环控制语句while
1.5基本数据类型转换
1.5.1介绍
当c程序在对变量进行赋值和运算时候,将会把精度较小的变量自动转换为精度较大的变量,即基本数据类型转换。
1.5.2数据类型按照精度大小排列为
short→int→long→float→double→long double
其中unsigned int大于signed int
1.5.3数据类型转换规则
char,short→int→unsigned→long→double
float→double
1.5.4代码
#include<stdio.h>
void main() {
char a1 = 'a';
int a2 = a1;
double a3 = a2;
printf("a1=%c, a2=%d, a3=%lf\n", a1, a2, a3);//char,short→int→unsigned→long→double
//float→double
char c1 = 97;
int c2 = 100;
int c3 = c1 + c2;
printf("c3=%d\n", c3);//两个不同精度的变量进行运算,精度较小的变量会自动转换成精度较大的变量
double b1 = 97.232141221564;
float b2 = b1;
printf("b2 = %.10f\n", b2);//精度较大的变量赋值给精度较小的变量,精度将会降低
}
- char,short→int→unsigned→long→double
float→double - 两个不同精度的变量进行运算,精度较小的变量会自动转换成精度较大的变量
- 精度较大的变量赋值给精度较小的变量,精度将会降低
1.6强制类型转换
1.6.1介绍
强制类型转换与基本类型转换不同,是由精度大的转向精度小的变量。使用的时候需要加上强制转换符()。需要特别注意的是,强制类型转换有时候会造成精度降低或者溢出。
强制转换符:(类型名)表达式
1.6.2代码
#include<stdio.h>
void main() {
double a1 = 9.7;//不改变a1的类型,a1仍然为double类型
int a2 = a1;//如果不加(int)则会warning
int a3 = (int)a1;//如果加(int)则不会warning,且直接截断小数后的部分,而非四舍五入
printf("a1 =%f a2 = %d a3 = %d\n", a1, a2, a3);
}
#include<stdio.h>
void main() {
//强制转换只对最近的操作数有效,若要对整个操作数进行强制转换,则需要把操作数放在括号内
int b1 = (int)9.7 * 10 + 6 *1.5;//9 * 10 + 6 * 1.5 = 99
int b2 = (int)(9.7 * 10 + 6 *1.5);//9.7 *10 + 6 * 1.5 = 106.0→106
//对整个计算括号起来后,就不会提示warning
printf("b1 = %d b2 = %d\n", b1, b2);
}
#include<stdio.h>
void main() {
char c1 = 'a';
int c2 = 1;
float c3 = 1.5f;
double c4 = c1 + c2 + c3;//可以运行 不会有warning, float→double
char c5 = c1 + c2 + c3;//warning float→char
printf("c4 = %.15f c5 = %c", c4 ,c5);
}
- 强制数据转换是由大精度→小精度,且强制数据转换不改变原操作数的本身类型。如果不使用强制转换符,即(类型名)表达式,在大精度到小精度的转换过程中,则会出现warning,若使用则不会出现。
- 在强制转换过程中是直接截断小精度后的数字,而非四舍五入。
- 强制转换只对最近的操作数有效,若要对整个操作数进行强制转换,则需要把操作数放在括号内。
1.7指针入门
1.7.1代码
#include<stdio.h>
void main() {
int a1 = 97;
//a的地址为多少
//1.输出变量的地址的格式为%p
//2.&p表示取出变量p对应的地址
printf("a1的值为=%d a1的地址为=%p\n", a1, &a1);
//变量→变量地址→变量内容
//定义一个指针变量
//1.int *指的是一个指针类型的变量
//2.这个指针类型的变量的名字为ptr, ptr就是一个int *类型的变量
//3.ptr指向一个int类型的变量的地址
//4.取出ptr的自身地址,&ptr
//5.取出ptr存放的a1的地址,ptr
//6.取出ptr指向的地址的内容,*ptr
int *ptr = &a1;
printf("ptr的地址是%p ptr存放的值是一个地址为%p ptr指向的地址的内容为%d", &ptr, ptr, *ptr);
}
- 变量→变量地址→变量内容
- 输出变量的地址的格式为%p
- &p表示取出变量p对应的地址
- 指针的形式为数据类型*,int *指的是一个指针类型的变量
- 这个指针类型的变量的名字为ptr, ptr就是一个int *类型的变量
- ptr指向一个int类型的变量的地址
- 取出ptr的自身地址,&ptr下·
- 取出ptr存放的a1的地址,ptr
- 取出ptr指向的地址的内容,*ptr
- 指针的类型和它所指向的变量的类型需要一致
1.7.2指针练习
写一个程序,获取一个int变量num的地址,并显示到中断讲num的地址赋给指针ptr,并通过ptr去修改num的值
#include<stdio.h>
void main() {
int num = 97;
int* ptr = #
printf("int类型的变量num的地址为%p\n", ptr);
*ptr = 7;
printf("修改后的num的值为%d", num);
}
1.8值传递和地址传递(指针传递)
1.8.1值传递和地址传递的类型
- 默认传递值的类型:基本数据类型 (整型类型、小数类型,字符类型),结构体,共用体
- 默认传递地址的类似:指针,数组
1.8.2值传递
值传递是将某一地址空间的内容(变量)复制到另一地址空间。
#include<stdio.h>
void main() {
int a1 = 97;
int a2 = a1;
printf("a2 = %d", a2);
}
1.8.3指针传递
指针传递是将某一地址空间的地址存在另一地址空间中
#include<stdio.h>
void main() {
int a = 97;
int* b = &a;//指针b指向a的地址空间
int* c = b;//指针c的内容为指针b的内容,即指针b和指针c都指向a的地址空间
printf("a的内容为%d\tb的内容为%p\tc的内容为%p\n", a, b, c);
*c = 7;//改变指针c指向的地址空间的内容,即a的内容,则a本身也会改变
printf("a的内容为%d\tb的内容为%p\tc的内容为%p\n", a, b, c);
}
举例:值传递就是我和你都有100块,你花多少与我无关;指针传递就是我和你公用100块,你用或者我用都会使得这100块改变。