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