概述
作业分析讲解:
=====================
1. 经验:
第一种: 寻找段错误的原因
思路:通过打印语句定位段错误的大致位置,然后用特殊的例子带入到你的代码中一步步计算打印关键变量的值
第二种: 写代码思路
‘ 特殊---》一般
2. 大端序和小端序
大端序: 数据的高字节存放在低地址,低字节存放在高地址
小端序: 数据的高字节存放在高地址,低字节存放在低地址
宏定义
================
1. 宏定义: 理解为字符的替换
语法: #define PI 3.14 //定义了一个宏,名字叫做PI,代表3.14这个小数
注意:宏定义的名字一般都写成大写
优点: 宏定义的执行效率很高(宏定义在预处理的时候就已经被替换了,而变量等到程序运行的时候才会加载到内存种参与运算),宏定义不是变量
宏定义总共两种表现形式:
形式1: 普通的宏定义 #define PI 3.14 不要理解为变量了
形式2: 宏函数 #define ADD(a,b) (a)+(b)
注意: 宏函数不是真正意义上的函数
宏函数一定加上圆括号(为了防止出现优先级的问题)
宏定义如果有多行(一行写不下),必须加上续行符
练习:
1. #define MUL(a,b) a*b
#define MUL(a,b) (a)*(b) //最安全正确的写法
MUL(1+2,3+4); //结果是多少
宏替换成1+2*3+4=11
宏替换成(1+2)*(3+4)=21
2. 面试题种所有宏定义相关的题目
C语言中printf和scanf的工作原理
==================
1. scanf工作原理
返回值:表示输入的符合要求的数据个数
scanf和printf在系统中有个IO缓冲区,键盘输入的内容先进入到缓冲区,然后scanf从缓冲区里面读取符合要求的数据
int getchar(void) 一次从缓冲区中读取一个字符(并把字符从缓冲区里面剔除)
2. printf工作原理
先将输出的内容存放到IO缓冲区里面,遇到n或者return 0 主函数退出会自动刷新缓冲区(把缓冲区里面的内容显示在液晶屏上面)
C语言中的结构体,共用体,枚举
==================
1. 结构体:
定义: struct 结构体的名字
{
结构体成员;
};
比如: struct student //把不同类型的数据打包成一个整体,程序员自定义了一种新的数据类型
{
char name[10];
int age;
};
简化书写 typedef struct student
{
char name[10];
int age;
}stu,*pstu; //stu就是 struct student 类型名 stu stu1; //stu1是个普通结构体变量
pstu就是struct student *类型名 pstu stu4; //stu4是个结构体指针变量
结构体的初始化和使用:
struct student stu1={“张三”,18};
struct student stu1;
stu1.name="张三";
stu1.age=18;
struct student stu1={
.name="张三";
.age=18;
}
struct student *stu1;
stu1->name="张三";
stu1->age=18;
struct student *stu1;
(*stu1).name="张三";
(*stu1).age=18;
普通结构体变量使用小数点引用成员:struct student stu1 stu1.age;
结构体指针使用->引用成员: struct student *p; p->age;
2. 结构体大小规则
32位系统
第一步:找到结构体成员中数据类型最大的成员
第二步:如果数据类型最大成员>=4字节,那么整个结构体按照4字节对齐
如果数据类型最大成员<4字节,那么整个结构体按照最大数据成员的大小对齐
第三步:如果char和short连续挨在一起,需要合并
64位系统
第一步:找到结构体成员中数据类型最大的成员
第二步:如果数据类型最大成员>=8字节,那么整个结构体按照8字节对齐
如果数据类型最大成员<8字节,那么整个结构体按照最大数据成员的大小对齐
第三步:如果char和short连续挨在一起,需要合并(小心这一步跟32位系统的区别)
3. 联合体(共用体)
定义: union 联合体的名字 //跟结构体写法类似
{
};
union sex
{
char a;
char b;
};
普通联合体变量: union sex sex1; sex1.a='M';
联合体指针: union sex *p=&sex1; p->b='W';
联合体数组: union sex array[10];
跟结构体的区别,特点:
联合体中所有的成员变量占用同一块内存区域(成员变量是互斥)
联合体大小由最大成员的大小决定,也要满足字节对齐
实际用途:
用来表示互斥的概念--》用联合体
union sex union 手机型号
{
char man; // 'M' --》男 'W' --》女
char woman;
}
4. 枚举:
定义: enum 枚举的名字 {枚举数据}
enum day {mon,tues,wen};
enum color {red, green blue};
练习:
1. 截图中的提示,求a是多少
C语言中的头文件
===================
作用: 包含其它头文件
结构体,联合体,枚举的定义
全局变量,函数的声明
内联函数定义
宏定义
头文件的标准写法:
参考系统中标准头文件: #ifndef _XXXX_H 目的为了防止重复包含同一个头文件
#define _XXXX_H
#endif
头文件<>和“”区别:
<> --》多用于系统自带的头文件,编译器会自动去系统的环境变量中寻找这个头文件
环境变量:系统的一个默认路径/usr/include
“” --》多用于自定义的头文件,编译器会自动从当前路径下寻找这个头文件,如果当前路径下面没有,就去环境变量中找
告诉编译器自定义的头文件在哪里
gcc hello.c -o hello -I头文件的路径
C语言程序编译的四个过程
============
hello.c源文件 --->hello 可执行程序 经历四个过程: 预处理--》编译--》汇编--》链接生成可执行程序
以前编译代码一步到位: gcc hello.c -o hello
现在分成四步:
第一步: 预处理 --》把C语言代码中所有#开头的语句展开
C语言#开头的语句只有三种:
第一种: #include <> 把头文件的源码搬过来
第二种:#define 宏替换,宏定义都替换成对应的字符
第三种:条件编译
gcc hello.c -o hello.i -E // -E编译选项表示我要对hello.c进行预处理
第二步:编译 --》把.i文件编译生成.s汇编文件
gcc hello.i -o hello.s -S // -S编译选项表示我要对hello.i编译成汇编代码
第三步:汇编 --》把.s文件编译生成.o文件
gcc hello.s -o hello.o -c //
第四步:链接生成可执行程序
gcc hello.o -o hello
C语言的条件编译(跟宏定义配合使用)
==============
1. 作用: 满足条件就会帮你编译代码,不满足,就不编译(代码写了跟没写一样,被注释掉了)
2. 写法一:
#if 宏定义 //判断宏定义的值是真还是假
代码;
#else
代码;
#endif
变形形式: #if #elif #else #endif
写法二:
#ifdef 宏定义 //宏定义定义了就执行,不是判断真假
代码;
#else //没有定义
代码;
#endif
写法三:
#ifndef 宏定义 // 宏定义没有定义就执行
代码;
#else //定义了就执行
代码;
#endif
注意:以上都是完整的标准写法, #else可以写也可以不写的
作业:
1. scanf("%d",&n); // 34hhh 不正确的整数
2. 面试题中结构体有关的题目全部做完
最后
以上就是漂亮眼睛为你收集整理的C语言(十二)的全部内容,希望文章能够帮你解决C语言(十二)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复