C语言第四次课重点(结构体,文件,关键字,bool型)
(1):回顾指针大小:指针的大小在x86下只能是4字节即32b,在x64下为8字节即64b。因为指针存放的是首地址。
(2)结构体 struct:设计出新的类型,由程序开发者自己设计。
struct student
{
};//需要加分号
struct student
{
char s_id[10];
char s_name[10];
char s_sex[5];
char s_age;
}
int main()
{
int a = 10;
struct student s1={"09001","yhping","man",23};//对结构体进行初始化,用花括号{}
printf("id:%s \n",s1.s_id);//s1为结构体变量 用 . 来进行访问
printf("name:%s \n",s1.s_name);//%s来打印字符串
printf("sex:%s \n",s1.s_sex);
printf("age:%n \n",s1.s_age);
return =0;
}
以下两种写法等价,用指针来访问:
struct student*sp=&s1;
//sp=&s1;
//*sp=s1;
printf("id: \n,"(*sp).s_id);//. 的优先级高于 * 所以必须括号(*sp)
printf("id: \n,"sp->s_id);//两者等价 第二种->指向符更简便
(3)文件
//读文件:“磁盘”——将文件数据复制到“缓冲区”——读缓冲区的数据到“程序”
//写文件: “程序”——把数据写到“缓冲区”——将缓冲区数据写到“磁盘”文件。
//因为内存存取速度比磁盘快得多。
//文件分为:文本文件(转为对应ASCII码值)和二进制文件(不进行转换直接用)。
#include <stdio,h>
int main()
{
int a = 0, b = 0;
scanf_s("%d,%d",&a,&b);//stdin 从std缓冲区提取数据 格式和scanf_s内格式相同
printf("a=%d b=%d \n",a,b);//stdout
return 0;
}
//stdin--buffer--stdout
输入12,23(scanf_s内格式为逗号分隔)
输出a=12 b=23
(4)关键字
size of(用来计算字节个数)不是宏也不是函数,是关键字。
#include <stdio,h>
int main()
{
int a = 10;
int size=sizeof(++a);//int size=4 仍打印整型字节,不解析表达式++a
printf("size:%d \n",size);//4
printf("a=%d,\n",a);
return 0;
}
size=4
a=10
#include <stdio,h>
int main()
{
int a = 10;
int size=sizeof(a+10.0);//变为double型 int size=8
printf("size:%d \n",size);//4
printf("a=%d,\n",a);
return 0;
}
10
010
0x10
0b1010:均为整型 size=4
12.23:double型 size=8;
#include<stdio.h>
#include<string.h>
int main()
{
char str[]={"yhping"};//字符串必须以\0结尾并且占一个空间
int size = sizeof(str);//type+num
int len = strlen(str);
printf("size:%d \n",size);//6+1=7算\0
printf("len:%d \n",len);//6 数组长度不算\0
return 0;
}
typedef 把合法的变量定义转化为别的类型声明。
unsigned char u_int8;//变量名
typedef unsigned char u_int8;//从变量名转化为类型名
数组所申请的空间大小是他的数组类型所占字节与数组的数据个数所占的乘积。
int short[10];//输出为2 * 10=20
static静态关键字(延长其寿命从.stack区移到.data区)
修饰 全局变量 局部变量 和 函数。
void fun(int x)
{
int a = 0;//函数结束后 a为局部变量 归还栈帧 a在.stack区
static int b = 0;//寿命延长 只做一次初始化 累加1 b在.data区
a +=1;//++a
b +=1;//++b
printf("a = %d,b= %d,\n",a,b);
}
int main()
{
for(int i=10;i > 0;i--)
{
fun(i);
}
return 0;
}
运行后a=1后面不变,静态关键字static延长其寿命 b=1 b=2一直到10。
(5)bool类型
//bool只有true和false,c语言中只有0是flase(假),非0都是true(真)。
//引入头文件#<stdbool,h>,在 . cpp文件中直接使用。
//bool占一个字节0000 0000假 0000 0001真。
int main()
{
char cha = '0';//字符0的ASCII值为48 true 即bool值为0000 0001
char chb = '\0';//空字符 0 flase bool:0000 0000
char chc = 0;//0 flase
int *p = NULL;//空指针宏定义为0 flase
return 0;
}
int main()
{
bool x = 1;//true
x -= 1;//flase只有0为假 非0都是真
x -= 1;//true
x -= 1//true
return 0;
}
关系表达式:运算结果为bool值
优先级:
//x大于等于10 且小于等于20 可写为:x>=10&&x<=20;不可把数学概念放入c语言概念,数学有无穷概念而c语言每个变量有范围,不要把数学表达式当c语言的表达式。
//如 5/2=2 整型/整型=整型;5/2.0=2.5 整型/浮点数=浮点数。
//算数优先级高于比较优先级即a+b>c为 先a+b再大于c。
逻辑表达式:运行结果为bool值
int main()
{
int a = 10;
bool x = flase;
x = !!a;
printf("%d,\n",x);//1 a为真 !a假 !!a为真 x为1
printf("%d,\n",a);//10 a的值不被影响 仍为10
return 0;
}