目录
一、内存与地址
1.内存
内存被划分为一个一个小的内存单元,为了管理这些内存单元,计算机给每一个内存单元进行编号。
内存单元的编号就是地址。
对于变量的地址:所占内存单元中第一个内存单元(一个内存单元的大小为一个字节)的编号。比如int a=10;变量a占4个字节,但是地址为a第一个字节。
而且因为每一次程序运行,内存都会重新给a分配一个空间,所以每一次运行程序打印出地址不一样。
地址以16进制方式打印:0x为16
进制的开头 16进制一共8位。
#include<stdio.h>
int main()
{
int a=10;
int*p=&a;
printf("%p",p);
return 0;
}
2. 地址的产生
(1)对于32位机器来说,它有32根地址线/数据线;给物理线进行物理通电——>产生(高电平和低电平(1/0))。每一根物理线产生一个数
(0/1)一共有32位,产生2^32种编号;
每一个编号有32位数,每一数被称为1bit位,而8个bit就是1个byte,所以在32位机中,一个地址的长度为4字节。
4个字节长度编号一共有2^32个地址可能
(2)x86表示32位机,x64表示64位机
二、结构体struct
1.什么是结构体
结构体(struct)是由一系列具有相同类型或不同类型的数据项构成的数据集合,这些数据项称为结构体的成员。
结构体是C语言中的一种构造类型。
2.创建结构体
结构体类型的定义
//创建学生信息档案,那么每个学生的信息有姓名,学号,性别等
// 对于姓名我们需要使用字符串类型,对于学号需要int型。
//对于这种不同类型的数据,我们可以创建结构体
struct Stu
{
//结构体的成员
char name[20];
int age;
char sex[10];
};
//对结构体进行初始化
int main()
{
struct Stu zhangsan = { "张三",24,"男" }; //对名字为张三的学生信息进行初始
struct Stu lisi = { "李四",20,"保密" }; //对名字为李四的学生信息进行初始化
//打印出学生信息方法一:
printf("%s %d %s", zhangsan.name, zhangsan.age, zhangsan.sex);
//打印出学生信息方法二:利用指针,结构体指针定义方式 struct name*p
struct Stu * pl = &lisi;
printf("%s %d %s\n", (*pl).name, (*pl).age, (*pl).sex);
//结构体指针*******************************
//结构体指针的使用 '->'
struct Stu * pl = &lisi;
printf("%s %d %s\n", pl->name, pl->age, pl->sex);
}
#include<stdio,h>
int main()
{
struct Stu
{
char name[10];
int age;
char sex[10];
};
//创建一个结构体
struct Stu s;
scanf("%s",&s.name); //这里是输入结构体s的name信息
printf("%s",s.name); //打印输入的信息
return 0;
}
三、数据类型
(1)数据类型的大小
一个字母占一个字节的空间;一个汉字占两个字节的空间;符号:英文标点占一个字节,中文标点占两个字节.
一个二进制数字序列,在计算机中作为一个数字单元,一般为8位二进制数.在32位机中也是一个字节。如一个ASCII码就是一个字节.此类单位的
1KGB=1024GB
1GB) =1024MB
1MB =1024KB
1KB =1024Byte
1Byte = 8bit
比特(bit)就是一个二进制位。
字节(byte)是计算机中数据类型最基本的单位了,8bit 组成1byte
字(word)两个byte称为一个word,所以一字大小应该是16位bit,共两字节。
(2)ASCII码的表示
char数据类型长度为1byte 即8位。
unsigned char 无符号的字符型 占1byte 即8位 它主要是为了能够兼容扩展ASCII码。
由于 char 由8位表示表示范围为 -128 - +127,无法表示带上扩展ASCII码总共256个字符所以如果把 8位中的最高位符号位也用来计数,就可以正好表示256个字符。
unsigned char 表示范围为 0 - 255 正好256个数可以对应包含扩展ASCII码在内的共计256个ASCII字。
(3)汉字的表示
汉字在计算机中存储是使用机内码来存储的,而常用汉字不过是几万个。如果用16位比特就可以表示了,所以汉字字符存储使用了两个字节。所以可以用两个字节储存一个汉字。
四、选择语句
1.C语言中的真与假
c语言规定0为假,非0就为真。
if(18<=age<40)//这种语言虽然没有语法错误,可以运行,但是逻辑上有错误
//例如输入10 从左到右,正确返回1,然后进行右边判断
//等价为if(0<40)这个的结果为真,可以运行。
2.if语句
if (age < 18)
printf("少年\n");
else if (age >= 18 && age < 40)
printf("青年\n");
else if (age >= 40 && age < 60)
printf("壮年\n");
else if (age >= 60 && age < 90)
printf("老年\n");
在if语句中else匹配的问题:与最近的if匹配
#include <stdio.h>
int main()
{
int a = 0;
int b = 2;
if (a == 1)
if (b == 2)
printf("hehe\n");
else
printf("haha\n");
return 0;
}
这个输出的结果是什么?
结果是什么都不会输出。因为这里的else与第二个if进行匹配。这个程序的逻辑结果是这样的
#include <stdio.h>
int main()
{
int a = 0;
int b = 2;
if (a == 1);
{
if(a==2)
printf("hehe\n");
else
printf("haha\n");
}
return 0;
}
所以if语句在书写的时候,当出现多个if条件的时候,最好使用花括号把语句的逻辑结果清楚的表示出来;
有兴趣的读者可以看看《高质量c/c++编程》,养成一个好的书写习惯;
3.switch语句
int main()
{
int day = 0;
scanf("%d", &day);
int n = 1;
switch (day)
{
case 1:
case 2:
case 3:
case 4:
case 5:
printf("weekday\n");
break;
case 6:
case 7:
printf("weekend\n");
break;
default:
printf("输入错误,请输入1~7的数字\n");
break;
}
return 0;
}
#include <stdio.h>
int main()
{
int n = 1;
int m = 2;
switch (n)
{
case 1:
m++; //m=3
case 2:
n++; //由于没有break语句,所以这句话需要执行n=2
case 3:
switch (n) //n=2从case 2:开始执行
{
case 1:
n++;
case 2:
m++; //m=4
n++; // n=3
break;
}
case 4:
m++; //m=5
break; //跳出循环
default:
break;
}
printf("m = %d, n = %d\n", m, n); 所以最后的结果为5 3
return 0;
}
这个程序的输出结果为5,3
switch语句的执行为:n等于多少,就从哪里开始执行case语句;如果没有break,就会一直执行后面的语句。直到遇见break或者全部执行完语句。
4.continue语句
continue的作用是终止当前的一次循环后面的内容,跳过去执行下一次循环的内容。
//写代码在屏幕上打印1~10
int main()
{
int i = 1;
while (i <= 10)
{
if (5 == i)
continue;//当i的值为5时,跳过循环后面的内容,回到while语句再次执行,所以出现了死循环。
printf("%d ", i);
i++;
}
return 0;
}
五、保留小数和四舍五入
C语言中小数保留问题满足四舍六入,五成双。%.mf 可以让浮点数保留 m 位小数输出。
规则为:
5以下舍弃 5以上进位。而当下一位为5时要讨论:被化简的小数位后面一位的数字等于5时
要看5前面的数字,若是奇数则进位,
若是偶数则将5舍掉,即修约后末尾数字都成为偶数;
若5的后面还有不为“0”的任何数,则此时无论5的前面是奇数还是偶数,均应进位。比如我们保留两位小数:
9.8249=9.82(小于5,舍掉), 9.82671=9.83(大于5进位)
9.8350=9.84(奇数进位), 9.8351=9.84(奇数进位)
9.8250=9.82(偶数舍弃), 9.82501=9.83(5后面有数应进位)
四舍五入到整数可以使用round().该函数的作用是把数四舍五入精确到整数。
#include<stdio.h>
#include<math.h>
int main()
{
double a=11.6789;
printf("%lf",round(a));
return 0;
}
如果想要四舍五入到第n位小数,我们可以使用以下这个公式:
#include<stdio.h>
//如果要把num四舍五入到n个小数位 不妨用
float num;
printf("%.nf",(num*1en+0.5)/1e(n.0))
//比如我们要四舍五入到第三位
float n=11.728889;
printf("%.3f",(n*1e3+0.5)/(10.0*10.0*10.0));