嵌入式小白day12——预处理和指针基础

目录

预处理

编译过程

c提供的预处理功能

1.宏定义

带参数的宏定义

2.文件包含

3.条件编译

指针基础

指针概念

指针变量

基类型

*

指针变量名

指针类型

指针变量的引用


预处理

                                    gcc常用选项列表

-c           只编译不链接,生成目标文件

-S          只编译不汇编,生成汇编代码

-E          只进行预编译,不做其他处理

-g          在可执行程序中包含标准提示信息

-n file     将file文件指定为输出文件 

预处理指令

gcc -E file.c -o hello.i

编译指令

gcc -S file.c -o hello.s

汇编指令 

gcc -c file.c -o hello.i

*.c——源文件

*.i——预处理文件

*.s——汇编文件

*.o——目标文件

编译过程

1.预处理(预编译)

作用:将代码中相关预处理命令执行,最终生成出一个只包含C语言代码的文件

2.编译

作用:对语法进行检查,将这个c的源代码生成汇编代码

3.汇编

作用:将汇编源代码最终生成机器语言

4.链接

作用:将使用到的其他代码链接到一起,生成最终可执行文件

c提供的预处理功能

(最终效果做文本替换)

1.宏定义

语法:#define 标识符 字符串 = #denfine 宏名 宏值

#define HONG 10

注意:

(1)预处理命令都是以#开头的;

(2)宏名命名规则和之前标识符命名规则一致,宏名一般写大写,以区别与普通变量名

(3)预处理实际上是将“宏名”用宏值(预处理阶段的字符串)原样输出(文本替换);

(4)应用:1.提高代码可读性;2.一改全改,方便代码修改

(5)宏名的作用域

注意:只是在预处理阶段发挥作用。

作用范围:从定义处开始到#undef(#undef 宏名 取消宏名的定义)结束,如果没加#undef,会一直到程序结束。

带参数的宏定义

语法:#define 宏名(参数)宏值

#define ADD(a+b) a+b

1.带参宏和函数本质的区别

(1)处理阶段不一样

宏定义是预处理阶段;函数是编译阶段

(2)使用不一样

宏是预处理阶段就使用结束

宏的使用,本质上是文本的原样替换;它的参数只是进行文本替换用,不进行语法检查,不能带类型符号。

函数是调用时进行使用

函数的使用本质上是函数代码的调用;参数是有类型的,编译阶段是进行类型检查的。

应用:

一般对于一些短小代码(一般不超过5行的代码),考虑写成带参宏。

带参宏的副作用

#define APP(a,b) a*b
printf("a*b = %d",APP(2+3,4+5));

此时APP里的运算为2+3*4+5

处理:把能加括号的地方都加括号

注意:宏定义必须写到一行中或着使用续行符,在每行后面加上\,并且其后面不能有空格符

2.文件包含

#incldue<文件名>
#include"文件名"

<>与" " 区别

在于查找头文件的方式不一样

<>表示到系统默认路径寻找对应的头文件;

" "表示先到当前目录下寻找头文件,如果没有,再到系统默认路径寻找;

3.条件编译

(1)

#ifdef 标识符
   程序段1
#else
   程序段2
#endif

含义:如果定义了标识符,则预处理程序段1(就是将程序段1的代码保留),否则保留程序段2

用途:1.调试代码;2.设计头文件

(2)

#ifndef 标识符
   程序段1
#else
   程序段2
#endif

含义:如果没有定义,则预处理程序段1,否则处理程序段2

(3)

#if 表达式(判断真假)
   程序段1
#else
   程序段2
#endif

含义:表达式为真处理程序段1,表达式为假处理程序段2

指针基础

指针概念

指针就是地址,地址就是数据在内存单元的编号

当指针为a时,指的是指针变量;当指针为0x1000时,指针指的是地址

指针也是一种数据类型,指针类型是专门来处理地址这种数据的;

指针变量

语法:基类型 *指针变量名

基类型

整型,浮点型,字符型,数据类型,指针类型,结构体类型,函数类型;

作用:用来表示这个指针类型指向的内存空间存放的是什么类型的数据;

*

定义的时候,表示此时定义的是一个指针类型的变量;

指针变量名

符号标识符命名的规则

int a = 10;  //a所在的空间是用来存放int类型的数据的
int *p = &a; //此时p指向了a

&a表示获得a所在空间的首地址;表示获得了一块可以存放int类型的内存空间地址。

指针类型

int *p;

(int *)就是指针类型

int * p 它首先表示的是一个指针类型,然后再表示指向int型数据的指针类型。

指针变量的引用

int a=10;
int *p = &a;  //p指向a,因为保存了a的地址

*是指针运算符,也是单目运算符,它的运算对象只能是指针(地址);

*p表示访问p所执行的基类型的内存空间

*p间接访问;通过a访问的是直接访问

访问步骤:1.首先拿出p中地址,到内存中定位;2.偏移出sizeof(基类型)大小的一块空间;

3.将偏移出的这块空间,当做一个基类型来看(*p运算完的效果)

*p运算效果就相当于是一个基类型的变量,整体等价来看*p等价于a。

  • 31
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值