知识点1【数据类型】
数据的不同类型 目的:合理的利用空间
char shout int long float double
计算机存储的是二进制。一位二进制只能存放 0 或 1 1b
1字节 == 8b(8位二进制)0000 0000 ~ 1111 1111
1B == 8b
1KB == 1024 B
1MB == 1024 KB
1GB == 1024 MB
1TB == 1024 GB
1PB == 1024 TB
-----------32位平台---------------
char 字符类型 占1字节的空间(8位二进制)
short 短字符型 占2字节的空间(16位二进制)
int 整形 占4字节的空间(32位二进制)
long 长整形 占4字节的空间(32位二进制)
float 单精度浮点型 占4字节的空间(32位二进制)
double 双精度浮点型 占8字节的空间(64位二进制)
案例:验证数据类型的长度
sizeof 测量数据类型的长度(用法如下):
#include<stdio.h>
int mian(int argc,char *argv[])
{
printf("sizeof(char)=%d\n",sizeof(char));
printf("sizeof(short)=%d\n",sizeof(short));
printf("sizeof(int)=%d\n",sizeof(int));
printf("sizeof(long)=%d\n",sizeof(long));
printf("sizeof(float)=%d\n",sizeof(float));
return 0;
}
知识点2【unsigned 和 signed】 (重要)
1、无符号数 unsigned
数据没有符号位,自身所有的二进制位都是数据位
比如:unsinger chat 0000 0000 ~ 1111 1111
2、有符号数 signed 默认一般省略
二进制的最高位为符号位,其他位为数据位。
signed char xxxx xxxx (x:0~1)
最高位为 1 表示负数,最高位为 0 表示正数
负数:1xxx xxxx 正数:0xxx xxxx
signed cahr 的表示范围: 1111 1111~1000 0000~0000 0000~01111 1111
案例:一字节:-10
1000 1010(-10的原码)
案例:
#include<stdio>
int mian(int argc,char *argv[])
{
//定义一个有符号int
signed int numl = 10;// signed 默认一般省略
int num2 = 10; //num2也是有符号int
//unsigned 表示无符号数 不能省略
unsigned int num3 = 10;
return 0;
}
知识点3【 struct 结构体 和 共用体 union】
1、struct 结构体 中的成员 拥有独立的空间
struct data1{
char 1;
short b;
int c;
}//设想为大学的床位,每一个人都有自己的床位
a,b,c,就是结构体中独立的成员
2、 union 共用体 中的成员 共享同一份空间
union data2{
char a;
short b;
int c;
}//设想大学宿舍的厕所,a,b,c,都可以去上一个厕所
知识点4【enum 和 void】
1、enum 枚举 将变量要赋的值一一列举出来
enum BOOL{false,true};
enum BOOL bool = false;
2、void 无类型(重要)
不能用 void 定义变量
int num;//√
void num;//× 系统不能确定给num开辟多大的空间
知识点5【其他关键字】(了解)
auto自动类型,(自动的字节长度 auto mun;)
register寄存器变量,
static静态变量,
const只读变量,
sizeof测类型的大小,
typedef为已有的类型 重新取一个别名
volatile防止编译器优化
1、register int num;//尽量将num放入寄存器中
总结:
1、如果没有显示表明 register(int num),如果num被高频繁使用 系统也会放入寄存器中
2、register int num ;//显示将num放入寄存器中
3、寄存器的变量 不能取地址 &num
#include<stdio.h>
int mian (int argc,char *argv[])
{
register int num = 10;
//%p输出地址
printf("%p\n",&num);//错误,寄存器变量不能取地址
return 0;
}
2、typedef 为已有类型取个别名
#include<stdio.h>
//给已有的int类型取个别名
typedef int INT32;
int mian(int argc,*argv[])
{
test01();
return 0;
}
void test01()
{
int num1 = 10;
INT num2 = 20;
printf("num1 = %d\n",&num1)
printf("num2 = %d\n",&num2)
}
3、volatile 防止编译器优化 强制访问内存操作
不能将常用数据存于寄存器中,必须从内存中读取,保证检测数据的及时更新
volatile int value;
知识点6【常量与变量】(重要)
1、常量 值不能被修改 (反:值不能被修改就是常量 ×)
常见的如 10 20 30 'a' "abcd"
2、变量 系统根据变量的类型 开辟对应的空间 其值可以被修改
变量名 代表的是 空间的内容
操作变量 就是 对空间内容的操作
变量名的命名规则:由数值、字符、下划线组成 但 不能以数字开头
A、num_1 B、_num1 C、1_num D、num //其中c是错误的
int num = 10;//变量名num代表的是空间的内容
知识点7【整形常量】(了解)
十进制:0~9
八进制:0~7
十六进制:0~15
八进制 十进制 十六进制 都是整形的输出形式。
void test03()
{
int num = 100;
//十进制输出
printf("十进制:num=%d\n",num);
//八进制输出
printf("八进制:num=%o\n",num);
//十六进制输出
printf("十六进制:num=%x\n",num);
//如果加上 # ,就可以在数字前面加上一定的标识符
//例如
printf("十六进制: num=%#x\n",num);
//不同进制 仅仅是数据的表现形式 不会修改数据本身(重要)
}
知识点9【整形变量的操作————读、写】取值赋值
void test04()
{
//局部变量不初始化,内容随机
int data = 0;
int num = 0;
printf("num = %d\n",num);//读 取值
num = 100
printf("num = %d\n",num);//读 取值
data = 100;
printf("num = %d\n",num);//读 取值
//从键盘输入
printf("请输入一个int数据:");
scanf(%d,&data);//&data 代表的事data对应空间的起始地址
printf("num = %d\n",num);//读 取值
}
运行结果:
2、整形的输出形式
void test05()
{
int num1 = 0;
//%d 有符号int形数据输出
printf("num1 = %d\n",num1);
unsigned int num2 = 0;
//%u 无符号int形数据输出
printf("num2 = %u\n",num2);
long num3 = 0;
//%ld 有符号long形数据输出
printf("num3 = %ld\n",num3);
unsigned long num4 = 0;
//%lu 有符号long形数据输出
printf("num4 = %lu\n",num4);
short num5 = 0;
//%hd 有符号short形数据输出
1 printf("num5 = %hd\n",num5);
unsigned short num6 = 0;
//%hd 无符号short形数据输出
1 printf("num6 = %hu\n",num6);
}
unsigned short num6 = 0;
scanf("%hu",&num6);//输入
知识点10【实型 常量】
void test06()
{
float f = 3.14;//会有个小报错
float f = 3.14f;//前后长度一样
//printf("f = %f\n",f); 输出float数据
//printf("d = %lf\n",d); 输出double数据
//scanf("%f",&f);
//scanf("%lf",&d);
//不以f结尾的 实型 为double类型
printf("sizeof(3.14) = %d\n",sizeof(3.14))/8
//以f结尾的 实型 为float类型
printf("sizeof(3.14f) = %d\n",sizeof(3.14f))//4
}
单精度(float)双精度(double)
float :占4字节,7位有效数字,指数-37~38
double:占8字节,16位有效数字,指数-307~308
知识点11【字符常量和变量】
1、字符常量(char类型 0~127)和变量
void test07()
{
//%c 输出的字符
printf("%c\n",'a');
//字符变量
//ch 存储的是‘a’的ASCII值
char ch = 'a';
printf("%c\n",ch); //%c 输出的是字符
printf("%d\n",ch); //%d 输出的是ASCII值
//'a' 单引号 表示取 字符的ASCII
//'a' == 97 完全等价
ch = ch + 1;
printf("%c\n",ch); //%c 输出的是字符
printf("%d\n",ch); //%d 输出的是ASCII值
}
总结:
1、'a'单引号 表示取a的ASCII值
2、字符在计算机存储的是ASCII值
void test08()
{
char ch = 'a';
printf("%d\n",sizeof('a'));//'a'表示的是97,数值默认是整形
printf("%d\n",sizeof(char));//表示的是char这个类型
}
void test09()
{
char ch;
printf("请输入一个字符:");
scanf("%c"&ch);
//scanf中的%c只能提取一个字符
//ch = getchar();//获取一个字符
//getchar();//丢弃一个字符
printf("ch = %c",ch);
printf("ch = %d",ch);
}
案例:提高 键盘输入“abc” 只取‘a’‘c’
void test10()
{
// '\n' 换行
// ‘\t' tab
printf("##%c##"\n,'\\');//两个\\输出一个\
printf("##%%##"\n);
printf("%d\n",'0')//48
printf("%d\n",\0)//0
printf("%d\n",0)//0
printf("%d\n","0")//字符0的地址,地址编号
}
知识点13【字符串】""双引号作用
void test11()
{
//%s 输出字符串
//''取得是字符的ASCII值 ""取得是字符串的首元素的地址
//%s 从字符串的首元素 逐个字符输出 遇到'\0'结束
printf("%s\n","hello");
//系统会在字符串末尾自动添加一个结束字符'\0'
printf("%d\n",sizeof("hello\0"));//输出为6 原因在上面
printf("%s\n","hello woeld");
printf("%s\n","hello\0 world");
printf("%s\n","\0hello\0 world");
}
例如:描述'a'和"a"的区别
'a'是字符 占1字节
"a"是字符串 占2字节
void test12()
{
printf("##############");
//%5d 表示占5个终端位宽 右对齐
printf('###%5d##'\n,123);
//%-5d 表示占5个终端位宽 左对齐
printf("##%-5d##,"123);
printf("##%05d##\n",123);
printf("##%-05d##\n",123);//不能这么写 会改变数据加0 所以不会起作用
//%5.2f 5表示总位宽为5 .2表示小数点保留两位
printf("##%5.2f\n##,"3.14159f);//3.14
}
知识点15【typedef】
为已有的类型重新 取个别名
1、用已有的类型 定义一个变量
2、用别名 替换 变量名
3、在整个表达式的前方加上typedef
案例1:
int INIT32;
typedef int INT32;
案例2:给 int arr[5] 取个别名 ARR
typedef int ARR[5];
ARR arr;//arr就是一个拥有5个int元素的数组