C语言基础

C程序编译过程

C程序编译步骤

  • 预处理:宏定义展开、头文件展开、条件编译等,同时将代码中的注释忽略,此处不检验语法
  • 编译:检验语法,将处理后的文件生成汇编文件
  • 汇编:将汇编文件生成目标文件(二进制文件)
  • 链接:C语言编写的程序需要依赖各种库,所以编译之后还需要把库链接到最终的可执行程序中

例子(gcc编译过程):

  • 分步编译

    1. 预处理:gcc -E hello.c -o hello.i
    2. 编译: gcc -S hello.i -o hello.s
    3. 汇编: gcc -c hello.s -o hello.o
    4. 链接: gcc hello.o -o hello
    选项 功能
    -E 只进行预处理
    -S 只进行预处理和编译
    -c 只进行预处理、编译和汇编
    -o <filename> 指定生成的输出文件名<filename>
  • 简化编译

    1. gcc hello.c -o hello

    不带选项,直接源文件编译为可执行文件(二进制文件)

汇编语言

一些汇编语言的操作符

操作符 作用
mov 移动
add 添加
push 压栈
pop 出栈
call 调用

eax 32位寄存器

32关键字

  • 数据类型关键字(12)

    • unsigned, signed
    • short, int, long, float, double, char
    • struct, union, enum
    • void
  • 存储类型关键字(5)

    • auto, static, register, extern, const
  • 控制语句关键字(12)

    • if, else, switch, case, default
    • for, while, do
    • break, continue
    • goto, return
  • 其他关键字(3)

    • sizeof
    • typedef
    • volatile

数据类型

  • 基本类型

    • 整型:short, int, long
    • 字符型:char
    • 实型【浮点型】:float,double
  • 构造类型

    • 数组类型
    • 结构类型:struct
    • 联合类型:union
    • 枚举类型:enum
  • 指针类型

常量

常量创建的两种方法

  • define宏定义

    1. #define 标识符 替换列表

    define定义的宏在编译后就不存在了【进行了宏展开】,它不占用内存,因为它不是变量

  • const修饰变量

    • const 是 constant 的缩写,意思是“恒定不变的”
    • 用 const 定义的变量的值是不允许改变的,即不允许给它重新赋值,即使是赋相同的值也不可以

    本质上是变量,只不过值是不允许改变的,所以叫常变量

    1. const 数据类型 变量名;

    用 const 修饰的变量,无论是全局变量还是局部变量,生存周期都是程序运行的整个过程

const VS define

  1. define是预编译指令,而const是普通变量的定义

    • define定义的宏是在预处理阶段展开的
    • const定义的只读变量是在编译运行阶段使用的
  2. const定义的是变量,而define定义的是常量

    • define定义的宏在编译后就不存在了,它不占用内存,因为它不是变量,系统只会给变量分配内存
    • const定义的常变量本质上仍然是一个变量,具有变量的基本属性,有类型、占用存储单元
    • 可以说,常变量是有名字的不变量,而常量是没有名字的。有名字就便于在程序中被引用,所以从使用的角度看
    • 除了不能作为数组的长度,用const定义的常变量具有宏的优点,而且使用更方便

因为const定义的对象有数据类型,而宏定义的对象没有数据类型。所以编译器可以对前者进行类型安全检查,而对后者只是机械地进行字符替换,没有类型安全检查。这样就很容易出问题,即“边际问题”或者说是“括号问题”

结论:所以编程时在使用const和define都可以的情况下尽量使用常变量来取代宏

补充:const 可以通过指针变相修改【C可以,C++不行】

  1. const int num = 520;
  2. int *p = &num;
  3. p = 1314;

size程序

类型限定

extern 声明变量,在变量未赋值前不占用空间

const 定义常变量【存储值不能修改的变量】

volatile 防止编译器优化代码

register 定义寄存器变量

goto语句

goto语句原则供参考

  • 使用goto语句只能goto到同一函数

  • goto的始与终

    • 应是函数内一段小功能的结束处

    • 函数内另外一段小功能的开始处  

  • 不能从一段复杂的执行状态中的位置goto到另外一个位置

  • 应该避免像两个方向跳转

指针

  • 野指针

    指针变量指向一个未知的空间【无法确定其内容的空间】

    操作系统将0~255作为系统占用空间,不允许访问操作

  • 空指针

    空指针是指内存空间编号为0的空间

  • 万能指针

    万能指针可以接收任意类型变量的内存地址

    注意:如果需要改变变量值,需要转换对应类型

指针和字符串

  1. char str[] = "hello world"; // 栈区字符串
  2. char* ptr = "hello world"; // 数据区常量区字符串
  3. // ch[2] = 'm'; // 通过
  4. // p[2] = 'm'; // err
  5. // *(p + 2) = 'm'; // err

作用域

变量类型 作用域 生命周期 存储位置
局部变量 函数内部 到函数结束 栈区
全局变量 项目中所有文件 到程序销毁 数据区
静态局部变量 函数内部 到程序销毁 数据区
静态全局变量 定义所在文件中 到程序销毁 数据区

函数

全局函数和静态函数

  • 在C语言中默认全部是全局函数,使用关键字static可以将函数声明为静态
  • 声明为静态意味着只能在创建函数的文件中使用

内存

  • 代码区【text】

    • 可执行文件的二进制代码(函数)

    共享,只读

  • 数据区【全局区静态区】

    • 未初始化数据区【bss】
    • 初始化数据区【data】
    • 文字常量区【data】
  • 栈区【stack】

    系统为每一个程序分配一个临时空间

    • 局部变量,函数信息,函数参数,数组...

    栈区大小为:1M

    • 可扩展【windows 10M】【Linux 16M】
  • 堆区【heap】

    存储大型数据【图片,音乐,视频】

    • 操作需求:

      • 手动开辟 malloc

      • 手动释放 free

    用于动态内存分配

进程内存结构

高地址 ↓

  • 栈区【向下增长】
  • 堆区【向上增长】
  • 未初始化全局变量【BSS区,用零初始化】
  • 已初始化全局变量、静态变量、常量数据【数据区】
  • 可执行代码【代码区】

低地址 ↑

可执行文件结构

  • 未初始化全局变量【BSS区,用零初始化】
  • 已初始化全局变量、静态变量、常量数据【数据区】
  • 可执行代码【代码区】

内存处理常见问题

  • 数组下标越界

  • 堆空间开辟野指针

    • int* p = (int*)malloc(0);
    • int* p = (int*)malloc(10); // 与整型不符,10/4
  • 堆空间不允许多次释放【空指针可以】

  • 开辟所用指针迷失,释放出错

联合体

  • 共用体占用的内存应足够存储共用体中最大的成员
  • 同一时间只使用一个变量【以最后一次赋值为基准】

文件指针

  1. typedef struct {
  2. short level; // 缓冲区“满”或者“空”的程度
  3. unsigned flags; // 文件状态标志
  4. char fd; // 文件描述符
  5. unsigned char hold; // 如无缓冲区不读取字符
  6. short bsize; // 缓冲区的大小
  7. unsigned char *buffer; // 数据缓冲区的位置
  8. unsigned ar; // 指针,当前指向
  9. unsigned istemp; // 临时文件,指示器
  10. short token; // 用于有效性的检查
  11. } FILE;

C语言基础要点的更多相关文章

  1. c语言基础知识要点

    C语言程序的构成 与C++.Java相比,C语言其实很简单,但却非常重要.因为它是C++.Java的基础.不把C语言基础打扎实,很难成为程序员高手. 一.C语言的结构 先通过一个简单的例子,把C语言的 ...

  2. JavaScript基础---语言基础(1)

    写在前面: 通过四篇博客把JS基础中的基础整理一下,方便自己查阅,这些内容对于实际项目开发中也许并不会在意,但是作为JS的语言基础,自觉还是应该熟悉.在完成这三篇博客(JavaScript基础---语 ...

  3. T-SQL语言基础(1)之理论背景

    从学校就开始接触和使用 SQL 了,但一直没有怎么细细去了解它,最近入职的公司比较重 T-SQL 部分,所以就准备系统的学习一下. 买了一本<Microsoft SQL Server 2008 ...

  4. 20165234 预备作业2 学习基础和C语言基础调查

    学习基础和C语言基础调查 一.技能学习经验及体会 你有什么技能比大多人(超过90%以上)更好? 看到这个问题,我仔细想了想,好像的确没有什么特别出众的技能,但是我想到了许多我个人的爱好. 我从小喜欢五 ...

  5. 20165207 学习基础与C语言基础调查反馈

    文章阅读体会与学习调查反馈 文章阅读体会 我在娄老师的文章里了解到了"做中学"的概念.并且通过娄老师慷慨地分享的相关经验,我对于它有了进一步的理解以及体会.以下是我收获以及我的感想 ...

  6. Java实例 Part2:Java语言基础

    Part2:Java语言基础 ** Example01:从控制台接收输入字符 ** 运行结果: 实现代码: import java.util.Scanner; public class Example ...

  7. C语言基础知识-数据类型

    C语言基础知识-数据类型 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.常量与变量 1>.关键字 C的关键字共有32个. >.数据类型关键字(12个) char,s ...

  8. 《MSSQL2008技术内幕:T-SQL语言基础》读书笔记(下)

    索引: 一.SQL Server的体系结构 二.查询 三.表表达式 四.集合运算 五.透视.逆透视及分组 六.数据修改 七.事务和并发 八.可编程对象 五.透视.逆透视及分组 5.1 透视 所谓透视( ...

  9. 《MSSQL2008技术内幕:T-SQL语言基础》读书笔记(上)

    索引: 一.SQL Server的体系结构 二.查询 三.表表达式 四.集合运算 五.透视.逆透视及分组 六.数据修改 七.事务和并发 八.可编程对象 一.SQL Server体系结构 1.1 数据库 ...

  10. C#语言基础

    第一部分 了解C# C#是微软公司在2000年7月发布的一种全新且简单.安全.面向对象的程序设计语言,是专门为.NET的应用而开发的.体现了当今最新的程序设计技术的功能和精华..NET框架为C#提供了 ...

随机推荐

  1. 配置Ingress支持HTTPS访问(二):使用cert-manager申请证书

    目录 一.系统环境 二.前言 三.Let's Encrypt和cert-manager简介 四.部署cert-manager 4.1 安装cert-manager 4.2 创建clusterissue ...

  2. elementui table tree懒加载只能执行一次的解决办法

    绑定 table的:key为随机值,在每次查询更新table时,更改key,就能刷新 table tree 懒加载只能第一次有效的问题, 本来那个懒加载只能执行一次,即使重新绑定了数据列表,再展开,也 ...

  3. C# winfrom 局域网版多人成语接龙(一)

    在学习 springjdbc+c3p0时做了一个数据库版的获得给定词汇的成语接龙,这个做了之后,我突然就想做一个可供多人游戏的成语接龙游戏,由于自己根本不熟悉java的图形界面开发,感觉没有winfo ...

  4. kubernetes 二次开发-认证,鉴权(1)

    基于webhook的认证 授权过程 认证授权服务需要满足如下kubernetes的规范 kubernetes api-server组件发送 http post 请求 url:https://authn ...

  5. Wpf UI框架 MaterialDesign 的使用记录

    近期公司有桌面客户端的开发需求,并且对样式和界面反馈有一定的要求,对比各种开源UI框架后确认使用MaterialDesign . 1.引入框架MaterialDesignThemes,注意下对应的版本 ...

  6. AIAGC导航(aiagc.com): 最全的AI工具导航网站

    AIAGC导航是一个专注于AI人工智能工具网站推荐的导航网站,可以帮助大家发现最新.最好用.最有趣的AI绘画.AI智能写作助手.AI聊天机器人.AI配音.AI音乐.AI换脸等各种AI工具应用软件,让A ...

  7. AutoLayout与UIbutton

    1.UIButton贴近右边,高度固定,宽度跟随标题变化 class TestButton: UIButton { } class ViewController: UIViewController { ...

  8. NOIP模拟61

    T1 交通 解题思路 把环视为点,对于原图中每一个点的两条入边以及两条出边分别连边. 优于保证了原图中每个点出入度都是 2 因此新图中一定由若干个偶数环所组成的. 并且对于环中一定是只能间隔着选点,因 ...

  9. JavaSE的方法 (函数)

    目录 Java中的方法(函数) 方法声明格式:(与函数类似) Java中的方法(函数) Java方法是一段可重复使用的代码块,用于执行特定的任务.方法可以接受输入参数并返回一个值.在Java中,方法由 ...

  10. filebeat实战

    1.打开filebeat支持nginx模块 [root@es-node1 /etc/filebeat]#ls fields.yml filebeat.reference.yml filebeat.ym ...