自学嵌入式第十二天C语言篇11

 编程流程:

        编辑、编译、运行、调试

                编译过程:

                        预处理、编译、汇编、链接

预处理

        也叫预编译,它会将代码中相关的预处理命令执行,最终会生产一个只包含C语言代码的文件

        作文本的替换

gcc main.c -E -o main.i

 

编译

        对语法进行检查,将C语言的源代码生成汇编代码 

gcc -S main.i -o main.s

汇编

        将汇编源代码最终生成 机器代码

gcc -c main.s -o main.o

链接

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

gcc main.o -o main

C语言提供的预处理的功能

1.宏定义

#define 标识符 字符串

#define 宏名 宏的值


#define N 10    //表示代码中出现的N都代表10,编写代码时,可以用N表示数组10


#undef 宏名     //表示取消宏名的定义,与#define搭配使用可以限定宏的作用域


//带参宏定义(宏函数)
#define 宏名(参数) 宏值

//带参宏定义实例
#define ADD(a,b) a+b

printf("x + y = %d\n",ADD(X,Y))

//注意:1.带参宏与函数有本质的区别
            //a.处理阶段不一样:宏定义在预处理截断;函数在编译阶段
                //宏的使用本质上是文本的原样替换,参数只进行文本替换,不进行语法检查
            //b.使用不一样:宏在预处理阶段就使用结束了;函数在调用时使用
                //函数的使用,本质上是函数代码的调用,函数的参数是有类型的,编译阶段要进行类型检查
            //应用:一般对应一些短小的代码,考虑写成宏
            //宏的副作用:
                //处理方法:把能加括号的地方都加上括号。
                //注意:宏定义必须写在同一行,也可以用'\'写多行,但是'\'后不能有空格

        注意:

                1.预处理命令都是以#开头的 

                2.宏名命名规则和之前标识符命名规则一致,宏名一般都写成大写,可以区别于普通变量。                

                3.预处理实际上是将宏名(预处理阶段的字符串)用宏值原样替换(文本替换)。C语言字符串出现的“宏名”不会被替换

        运用:

                1.提高代码可读性

                2.批量修改重复的值(一改全改),方便代码修改。

        宏的作用域:

                此时的作用域只是在预处理阶段发挥作用;作用范围是从定义处到#undef结束。

2.文件包含

        #include

//
#include <stdio.h>

//
#include "file.txt"

//<>与""的区别
    //<>//表示到系统默认的路径下寻找对应的文件
    //""//表示先在当前目录下找对应的文件,没找到的话到再去系统默认的路径下去找对应的文件

3.条件编译 

//如果定义了标识符则预处理程序段1,否则预处理程序段2
#ifdef 标识符
    程序段 1
#else
    程序段 2
#endif

//主要用途:
    //调试代码
    //设计头文件
#ifndef _STDIO_H    //如果没有定义_STDIO_H这个宏
#define_STDIO_H     //就定义这个宏

这里可以包含.c文件要用到的头文件

#endif              //结束
//这样的写法可以使得多文件编译时防止重复包含同一个头文件。


//如果没有定义标识符则预处理程序段1,否则预处理程序段2
#ifndef 标识符
    程序段 1
#else
    程序段 2
#endif

//如果表达式成立,则预处理程序段1,表达式为假,处理程序段2
#if 表达式
    程序段 1
#else 
    程序段 2
#endif

指针

        指针基础

                指针的概念

                        地址--内存单元的编号,即指针;指针也是一种数据类型(指针类型),专门用来处理地址这种数据。

                定义指针变量

//指针比较特殊,没有特定的符号

//定义形式
基本类型 * 指针变量名

//基类型作用:表示该指针类型所指向的空间存放的数据的数据类型
//*在定义时,表示此时定义的时一个指针类型的变量

//指针变量名符合标识符命名规则。


int a;
int * p = &a;

                指针类型

                        int * 整体叫指针类型 

                                含义:表示是一个指针类型;表示指向int类型数据的指针类型

                指针变量的引用

int a = 10;

int *p = &a;    //表示p指针指向了a

//引用指针时*为指针运算符,为单目运算符;运算对象只能是指针(地址)

//*p表示访问p指向空间的内容;*p间接访问;通过a访问为直接访问

//*p运算分三步
//step1:首先拿出p中的地址,放到内存中定位
//step2:然后偏移出sizeof(基类型)大小的一块空间
//step3:将偏移出的这块空间,当作一个基类型的变量来看

//此时*p <=> a;

                指针传参 

                        明天接着更

         

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值