C/C++
文章平均质量分 74
C/C++ 学习笔记
柚咖
这个作者很懒,什么都没留下…
展开
-
C/C++ 学习笔记
UnitModule地址 C语言简介 基础知识 基本数据类型C、C++、Java 基本数据类型对比 C 语言格式转换符 输入输出printf() scanf() 字符的 I/O 运算符运算符及优先级 自增和自减运算符 逗号运算符 iso 646.h 头文件 流程控制 分支语句 循环语句 函数 函数的定义和声明 数组和指针 一维数组一维数组初始化 指针指针 [转] 指针详解 指针和数组的区别和联系 字符串及其函数 字符串及其函数字符串 字符函数ctype.h..原创 2021-07-18 13:08:02 · 352 阅读 · 0 评论 -
学习资料
《鸟哥的Linux私房菜 基础篇》 《C程序设计语言》 丹尼斯写的 《Linux C编程一站式学习》 宋劲杉写的 《Eensstial C++》 《C++ Primer》 《Effective C++》 《Linux网络编程》 宋劲彬写的 《Unix环境高级编程》 《Unix网络编程》 两部 《Linux高级程序设计》 华清远见的 《MySQL必知必会》 《数据库系统概念》 ...原创 2018-03-19 19:24:28 · 399 阅读 · 0 评论 -
C++ —— 练习:模拟队列
假设现在要建立一个 ATM,并对顾客排队等待的时间进行估测,需要编写一个程序来模拟这种情况。对于这种问题,最自然的方法是使用队列。Queue 类类接口首先,要设计一个 Queue 类,这里先列出队列的特征:队列存储有序的项目序列;队列容纳的项目数有限制;能创建空队列;能检查队列是否为空;能检查队列是否为满;能在队尾添加项目;能在队首删除项目;能确定队列中项目数。链表首先需要解决的问题就是如何表示队列数据?一种方法是使用 new 动态分配一个数组,但对于队列操作而言,数组有点不太原创 2022-05-28 02:16:13 · 775 阅读 · 1 评论 -
C++ —— 指向对象的指针
C++程序经常使用指向对象的指针,通常会搭配 new 来使用,例如,Class_Name 是类,value 是 Type_Name 类型:Class_Name * ptr = new Class_Name(value);该语句会调用如下的构造函数:Class_Name(Type_Name &);而下面的初始化则是会调用默认构造函数:Class_Name * ptr = new Class_Name;再谈 new 和 delete对于类对象我们可以在两个层次上使用 new 和 de原创 2022-05-27 00:43:13 · 3361 阅读 · 0 评论 -
C++ —— 有关函数返回对象的说明
当成员函数或独立的函数返回对象时,有几种返回方式可供选择。可以返回指向对象的引用、指向对象的 const 引用、const 对象。返回指向 const 对象的引用使用 const 引用的常见原因是旨在提高效率,但对于何时采用这种方法存在一些限制。如果函数返回传递给它的对象,可以通过返回引用来提高效率。例如,编写函数 Max(),它返回两个 Object 对象中较大的一个(假设 Object 类重载了比较运算符)。// Version 1Object Max(const Object & ob原创 2022-05-27 00:41:13 · 1972 阅读 · 0 评论 -
C++ —— 自定义 StringBad 类
假设要创建一个类,该类的一个成员表示人的姓名。最简单的方法是使用字符数组来保存姓名,但这种方法有一些缺陷,刚开始也许会使用一个10个字符的数组,然后发现有的人名字太长,数组存不下,更保险的方法是,使用一个40个字符的。然而,如果创建包含2000个这种对象的数组,因为字符数组只使用了一部分,就会浪费大量的内存。解决这种问题的方法是:在程序运行时(而不是编译时)就确定使用多少的内存。C++ 的方法是,在类构造函数中使用 new 运算符在程序运行时分配所需的内存。对于保存姓名字符的这种情况,通常是使用 stri原创 2022-05-27 00:39:17 · 313 阅读 · 0 评论 -
C++ —— 成员函数复习
this 和 const所有的成员函数其实都包含一个隐式参数 *this。由于不会显式传递调用函数的对象,因此不能在参数前面加上 const 表示成员函数不会修改调用该函数的对象,而是在函数后面加上 const 关键字。void Class::show() const;// =>void show(const Class &);成员函数声明成员函数类成员函数的声明和普通函数的声明类似。class Demo {private: int value; doubl原创 2022-05-27 00:37:26 · 155 阅读 · 0 评论 -
C++ —— 类函数总结
成员函数声明成员函数类成员函数的声明和普通函数的声明类似。class Demo {private: int value; double num;public: int showFunc(int);}实现成员函数类成员函数的实现和普通函数的实现有一些区别。类成员函数实现时函数名需要使用全名(限定名),成员函数可以访问类的私有成员。int Demo::showFunc(int) { // 实现细节}内联成员函数隐式内联。直接在类声明中用成员函数定义替换成员原创 2022-03-31 02:24:01 · 491 阅读 · 0 评论 -
C++ —— 类的自动转换和强制类型转换
转换构造函数C++ 基本数据类型之间是可以经过一些类型转换的。将一个基本数据类型变量的值赋给另一个基本数据类型变量时,如果这两种类型兼容,则 C++ 自动将这个值转换为接收变量的类型;如果不兼容,C++ 不会自动转换,此时可以使用强制类型转换,不过要注意这种转换是否有意义。C++ 的目标之一就是使用类对象可以像使用内置类型变量一样,对于类型转换这一部分,C++ 也提供了一种类型转换的机制。通过这个机制,可以将类定义成与基本数据类型 or 另一个类相关,使得从一种类型转换成另一种类型是有意义的。在这种情况原创 2022-03-31 02:23:16 · 2301 阅读 · 0 评论 -
C++ —— 重载运算符练习: 矢量类
练习代码由于无法用一个数来表示矢量,因此应该创建一个类来表示矢量。矢量的相加和相减与普通数学运算有相似之处,所以应重载运算符使之能用于矢量。本节将实现一个二维矢量,描述二维矢量需要有两个数,但有两种方式:用长度和角度表示(极坐标);用水平分量 x 和垂直分量 y 表示(直角坐标)。#ifndef VECTOR_H_#define VECTOR_H_#include <iostream>namespace VECTOR { class Vector { publ原创 2022-03-28 23:38:32 · 1615 阅读 · 0 评论 -
C++ —— 友元函数
C++ 控制对类对象私有部分的访问。通常,公有类方法提供唯一的访问途径,但是有时候这种限制太严格,以致于不适合特定的编程问题。在这种情况下,C++ 提供了另外一种形式的访问权限:友元。友元有三种形式 —— 友元函数、友元成员函数、友元类。这里只介绍友元函数。当函数被声明为类的友元函数,可以赋予该函数与类的成员函数相同的访问权限。为什么需要友元函数在为类重载二元运算符时常常需要用到友元函数。例如,为一个时间类 Time 重载乘法运算符,使其可以乘以一个实数,部分代码如下所示:class Time {原创 2022-03-27 22:21:51 · 8623 阅读 · 0 评论 -
C++ —— 运算符重载
运算符重载介绍C++ 允许将标准的运算符用于类对象,例如 +、= 等。运算符重载是一种形式的 C++ 多态,能够使对象操作更美观。运算符重载其实是一种特殊的成员函数。什么是多态:字面意思就是一种事物有多种形态。对于 C++ 来说,就是指调用函数时,会根据参数的不同来执行不同的函数。其中函数重载就是一种常见的多态,另外一种常见的多态会在继承相关章节的知识中介绍。实际上,很多 C++ 运算符已经被重载了,例如,将 * 运算符,如果它的运算对象为地址,将得到存储在这个地址中的值;但如果它的运算对象为两个数字原创 2022-03-27 22:21:12 · 2377 阅读 · 1 评论 -
C++ —— const 和 this
const 成员函数先声明一个 Demo 类:#ifndef CONST_OBJECT_H_#define CONST_OBJECT_H_#include <string>// const 成员函数class Demo {private: int value; std::string id;public: Demo(); Demo(int, std::string); ~Demo(); void show();};Demo::D原创 2022-03-16 01:28:33 · 395 阅读 · 0 评论 -
C++ —— 类作用域与常量
之前学习过全局(文件)作用域和局部(代码块)作用域。全局作用域的变量可以在其所属文件的任何地方使用它,而局部作用域的变量只能在其所属的代码块中使用。函数名的作用域不能是局部作用域 —— 不能在函数中定义函数。C++ 引入了一个新的作用域 —— 类作用域。类作用域介绍类作用域:在类中定义的名称的作用域为整个类。例如,类的数据成员名和成员函数名。作用域为整个类的名称只在该类中是已知的,在类外是不可知的。因此,可以在不同类中使用相同的类成员名而不会引起冲突。另外,类作用域意味着不能从外部直接访问类的成员,公有原创 2022-03-16 01:25:26 · 1178 阅读 · 0 评论 -
C++ —— 对象数组
用户通常都需要创建同一个类的多个对象,可以创建独立的对象变量,但也可以创建对象数组。其实前面已经学过结构数组了,对象数组这部分内容很容易就能掌握了。声明对象数组声明对象数组的方法和声明标准类型数组相同:Stock arr[10]; // 创建10个Stock对象的数组上述代码没有显式初始化,所有对象都将调用默认构造函数。除此之外,还可以用构造函数来初始化数组元素。Stock arr[5] = { Stock(), // 手动调用默认构造函数 Stock("Stock1", 3,原创 2022-03-16 01:23:36 · 1434 阅读 · 0 评论 -
C++ —— 类的声明
自定义类型1. 定义类型需要做什么在自定义类型之前,需要了解定义类型都需要做什么。C++ 的基本数据类型完成了三项工作:决定数据对象需要的内存数量;决定如何解释内存中的位;决定如何使用数据对象执行的操作或方法。对于内置类型来说,有关操作被内置到编译器中。例如,整型可以进行 % 运算,而浮点型不可以。2. C 和 C++ 自定义类型的演示在 C++ 中定义用户自定义的类型时,就必须自己提供操作自定义类型的方法。付出这些劳动换来了根据实际需要定制新数据类型的强大功能和灵活性。例如,自定义一个原创 2022-03-08 17:53:13 · 6731 阅读 · 0 评论 -
C++ —— 面向对象编程
OOP 和 POPOOP 全称 Object Oriented Programming,即面向对象编程;POP 全程 Procedure Oriented Programming,即面向过程编程 or 过程性编程。面向对象编程是一种特殊的设计程序的概念性方法,它是一种编程思想,并不是 C++ 特有的。实际上,使用 C 语言依旧可以采取面向对象编程,只是 C++ 通过一些特性改进了 C 语言,使得 C++ 应用面向对象编程更容易。面向对象编程的重要特性有:抽象、封装、继承、多态、代码的可重用性。原创 2022-03-08 17:50:57 · 2047 阅读 · 0 评论 -
C++ —— 类的使用
Stock 类声明代码知道如何创建类声明以及实现类的成员函数之后,这里以股票为例,创建了一个 Stock 类的声明,以及实现 Stock 声明中的成员函数。// Stock 类声明// source/2.1/stock00.h#ifndef STOCK00_H_#define STOCK00_H_#include <iostream>class Stock {private: std::string company; // 公司 long shares; //原创 2022-03-08 17:50:15 · 1675 阅读 · 0 评论 -
构造方法和析构方法
对于类声明,还有一些其他工作要做 —— 应为类提供构造方法和析构方法。为什么要提供构造函数?先说结论:由于 C++ 对类的数据进行了隐藏,程序不能直接访问类的数据,需要通过成员函数来访问数据成员,因此需要提供一个成员函数来进行初始化,这个成员函数就是构造函数。也就是说,构造函数就是专门用来初始化类对象的成员函数。C++ 的目标之一就是使用类对象可以像使用内置类型变量一样。到目前为止,可以像声明内置类型变量那样声明类对象,int a;–> Stock sally;;但是无法像初始化内置类型变量原创 2022-03-08 17:47:33 · 889 阅读 · 0 评论 -
4. 内存模型
存储期(存储持续性)根据用于分配内存的方法,C++ 有 3 种管理数据内存的方式:自动存储、静态存储、动态存储 (有时也叫作自由存储空间或堆)。C++11 新增了第四种类型 —— 线程存储。自动存储在函数内部定义的常规变量使用自动存储空间,被称为自动变量。这意味着它们在所属的函数被调用时自动产生,在该函数结束时自动消亡。实际上,自动变量是一个局部变量,其作用域为包含它的代码块。PS:代码块是被包含在花括号中的一段代码。自动变量通常存储在栈中,这意味着执行代码块时,这些变量依次入栈,而在离开代原创 2022-03-04 17:48:12 · 236 阅读 · 0 评论 -
3. 函数探幽
前面的知识中,C++ 和 C 语言的差别其实并不大,C++ 只是新增了 bool 类型变量、const 关键字、变量初始化方法、修改了 auto 关键字的作用。PS:C 语言后来也引入了 const 关键字,_Bool 类型。在函数这里,C++ 提供了很多新的函数特性,包括内联函数、按引用传递变量、默认参数值、函数重载以及模板函数。函数是进入加加 (++) 领域的重要一步。C++ 内联函数内联函数是 C++ 提高程序运行速度所做的一项改进。常规函数和内联函数之间的区别不在于编写方式,而在于 C+原创 2022-03-04 17:47:11 · 411 阅读 · 0 评论 -
2. 数组的替代品
模板类 vector 和 array 都是数组的“替代品”。vector模板类 vector 类似于 string 类,也是一种动态数组。可以在运行阶段设置 vector 对象的长度,可以在末尾添加新数据,还可以在中间插入新数据。基本上,它是使用 new 创建动态数组的替代品。实际上,vector 类确实是用 new 和 delete 管理内存的,但这个工作是自动完成的。这里只是简单介绍一下如何使用 vector。首先,要使用 vector 对象,必须包含头文件 vector。其次,vector原创 2022-03-04 17:44:54 · 156 阅读 · 0 评论 -
1. 复合类型
C++ 和 C 语言一样有数组、字符串、指针、结构体、共用体、枚举这些复合类型,它们的基本使用都是差不多的。数组和 C 语言一样,C++ 的数组也是存储多个相同类型的数据格式。数组声明typeName arrayName [Size];。数组初始化延续 C 语言部分:只有在声明数组时才可以初始化,此后就再也不能初始化了。不允许用数组直接给另一个数组赋值。可以使用列表初始化。初始化数组时,提供的值少于数组元素数目,省略的元素被设置为 0。C++ 新增部分:首先,初始化数组时可以省原创 2022-03-04 17:43:58 · 428 阅读 · 0 评论 -
C++ 和 C 语言
C++ 和 C 语言的联系C++ 名称中的 ++ 其实就是 C 语言中的递增运算符(++),这个名称也表明 C++ 是 C 语言的扩充版本。那么 C++ 是在 C 语言的基础上添加了什么?C++ 在 C 语言的基础上添加了面向对象编程和泛型编程的支持。面向对象编程的特性带来了全新的编程方法,这种方法可以应付复杂程度不断提高的现代编程任务。C++ 的模板特性则提供了另一种全新的编程方法 —— 泛型编程。这也使得 C++ 融合了 3 种不同的编程方式:C 语言传统的面向过程编程、C++ 新增的面向对象原创 2022-03-04 17:40:10 · 529 阅读 · 0 评论 -
C 语言 —— 结构体
结构简介什么是结构?为什么要用结构? 编写代码时,最重要的步骤之一是选择表示数据的方法。在许多情况下,基本的变量类型和数组还步够,为此 C 提供了结构变量来表示复杂的数据。例如,对于一本书,可能需要书名、作者、价格等属性。使用结构需要掌握的三个技巧:为结构建立一个格式或样式;声明一个合适该样式的变量;访问结构变量的各个部分。建立结构声明结构声明描述了一个结构的组织布局。struct book { char title[100]; char author[80]; float v原创 2022-03-01 17:49:20 · 504 阅读 · 0 评论 -
C 语言 —— C 库介绍
最初,并没有官方的 C 库。后来,基于 UNIX 的 C 实现成为了标准。ANSI C 委员会主要以这个标准为基础,开发了一个官方的标准库。在意识到 C 语言的应用范围不断扩大后,该委员会重新定义了这个库,使之可以应用于其他系统。我们讨论过一些标准库中的 I/O 函数、字符函数和字符串函数。本章将介绍更多函数。不过,首先要学习如何使用库。访问 C 库如何访问C库取决于实现,因此你要了解当前系统的一般情况。首先,可以在多个不同的位置找到库函数。例如,getchar() 函数通常作为宏定义在 stdio原创 2021-10-28 10:18:30 · 2596 阅读 · 0 评论 -
C 语言 —— _Noreturn 关键字
C99 新增 inline 关键字时,它是唯一的函数说明符(关键字 extern 和 static 是存储类别说明符,可应用于数据对象和函数)。C11 新增了第2个函数说明符 _Noreturn,表明调用完成后函数不返回主调函数。exit() 函数是_Noreturn 函数的一个示例,一旦调用 exit(),它不会再返回主调函数。注意,这与 void 返回类型不同。void 类型的函数在执行完毕后返回主调函数,只是它不提供返回值。_Noreturn 的目的是告诉用户和编译器,这个特殊的函数不会把控制返原创 2021-10-26 14:51:36 · 2418 阅读 · 0 评论 -
C 语言 —— 内联函数(C99)
通常,函数调用都有一定的开销,因为函数的调用过程包括建立调用、传递参数、跳转到函数代码并返回。这个过程中 CPU 需要先将调用函数之前的一些环境到栈中,例如一些参数的值等,然后跳转到调用的函数的位置执行函数体中的运算,然后再从栈将函数调用的环境恢复,再执行函数调用之后的代码。如果调用的函数很简单,只有几行代码量,那么函数调用中的开销就会在整个函数调用过程中占据一个比较大的比例,这时候就不如直接将这几行代码写在程序中,而不是将其作为函数。int sum(int a, int b) { return a+b原创 2021-10-26 14:50:36 · 1136 阅读 · 0 评论 -
C 语言 —— 泛型选择表达式(C11)
在程序设计中,泛型编程(generic programming)指那些没有特定类型,但是一旦指定一种类型,就可以转换成指定类型的代码。例如,C++ 在模板中可以创建泛型算法,然后编译器根据指定的类型自动使用实例化代码。C 没有这种泛型编程。然而,C11 新增了一种表达式,叫作泛型选择表达式(generic selection expression),可根据表达式的类型(即表达式的类型是 int、double 还是其他类型)选择一个值。泛型选择表达式不是预处理器指令,但是在一些泛型编程中它常用作 #def原创 2021-10-26 14:49:36 · 2249 阅读 · 2 评论 -
C 语言 —— 其他预处理指令
程序员可能要为不同的工作环境准备 C 程序和 C 库包。不同的环境可能使用不同的代码类型。预处理器提供一些指令,程序员通过修改 #define 的值即可生成可移植的代码。#undef 指令取消之前的 #define 定义。#ifdef、#ifndef、#else、#endif、#if 和 #elif 指令用于条件编译,即指定什么情况下编写哪些代码。#line 指令用于重置行和文件信息,#error 指令用于给出错误消息,#pragma 指令用于向编译器发出指令。#undef 指令#undef 指令用原创 2021-10-26 14:48:13 · 354 阅读 · 0 评论 -
C 语言 —— 文件包含指令:#include
#include 介绍当预处理器发现 #include 指令时,会查看后面的文件名并把文件的内容包含到当前文件中,即替换源文件中的 #include 指令。这相当于把被包含文件的全部内容输入到源文件 #include 指令所在的位置。#include 指令有两种形式:#include <stdio.h> // 文件名在尖括号中 #include "mystuff.h" // 文件名在双引号中在 UNIX 系统中,尖括号告诉预处理器在标准系统目录中查找该文件。双引号告诉预处理器原创 2021-10-25 18:30:05 · 1407 阅读 · 0 评论 -
C 语言 —— 明示常量指令:#define
预处理指令可以出现在源文件的任何地方。变量有作用域,#define 定义的明示常量同样有其作用区域,其定义从指令出现的地方到该文件末尾或者 #undef 命令之间有效。使用 #define 指令最常见的用法就是用来定义明示常量(也叫做符号常量),但是该指令还有许多其他用途。用法:#define 标识符 常量。注意后面没有分号!!#define 又称宏定义,标识符是所定义的宏名,简称宏。标识符的命名规则遵守 C 语言的标识符命名规则,不过通常采用大写字母来命名宏,以此提醒程序员注意。#define原创 2021-10-22 18:13:54 · 4168 阅读 · 0 评论 -
C 语言 —— 位字段
操作位的方法除了位运算符之外,第2种方法是位字段。位字段是一个 signed int 或 unsigned int 类型变量中的一组相邻的位。C99 和 C11 新增了 _Bool 类型的位字段。位字段通过一个结构声明来建立,该结构声明为每个字段提供标签,并确定该字段的宽度。struct { unsigned int autfd : 1; unsigned int bldfc : 1; unsigned int undln : 1; unsigned int it原创 2021-10-13 10:05:07 · 552 阅读 · 0 评论 -
C 语言 —— 函数指针
函数指针有什么用?C 语言指针除了可以指向变量之外,还可以声明指向函数的指针,这种指针被称为函数指针。**这个复杂的玩 **意儿到底有何用处?函数指针可以作为另一个函数的参数,告诉该函数要使用哪一个函数。例如,回调函数就是用函数指针。函数指针可以作为结构体的成员。在结构体中不能直接声明函数,但是可以声明函数指针。这样就可以用结构体替代 C++ 中的类,这也体现了面向对象是一种思想,而不是语言,因为使用 C 语言一样可以实现面向对象编程(面向对象编程这里不过多介绍)。这里主要介绍函数指针的第原创 2021-10-12 19:00:07 · 462 阅读 · 0 评论 -
C 语言 —— typedef 简介
typedef 工具是一个高级数据特性,利用 typedef 可以为某一类型自定义名称。typedef 是 type define 的缩写。在使用时和 #define 类似,但两者有3点不同:与 #define 不同,typedef 创建的符号名只受限于类型,不能用于值。typedef 由编译器解释,不是预处理器。在其受限范围内,typedef 比 #define 更灵活。下面介绍 typedef 的工作原理。假设要用 BYTE 表示1字节的数组。只需像定义个 char 类型变量一样定原创 2021-10-12 14:51:49 · 4925 阅读 · 1 评论 -
C 语言 —— 文件 I/O 函数
fopen() 函数// fopen() 函数原型,位于 <stdio.h> 头文件中FILE* fopen(const char *filename, const char *mode);参数:第1个参数是保存文件名的字符串,第2个参数是打开文件的模式。功能:以指定的 mode 模式打开名为 filename 的文件,返回一个指向 FILE 结构的指针。返回:指向指定文件的 FILE 对象的指针。通常,使用标准 I/O 的第1步就是调用 fopen() 打开文件。fopen(原创 2021-10-11 16:34:21 · 305 阅读 · 0 评论 -
C 语言 —— 标准 IO
与底层 I/O 相比,标准 I/O 包除了可移植以外还有两个好处。第一,标准 I/O 有许多专门的函数简化了处理不同 I/O 的问题。第二,输入和输出都是缓冲的。也就是说,一次转移一大块信息而不是一字节信息(通常至少 512 字节)。这种缓冲极大地提高了数据传输速率。程序可以检查缓冲区中的字节。缓冲在后台处理,所以让人有逐字符访问的错觉(如果使用底层 I/O,要自己完成大部分工作)。1. fopen() 函数FILE* fopen(const char *filename, const char *原创 2021-10-06 21:14:43 · 270 阅读 · 0 评论 -
C 语言 —— 与文件进行通信
我们程序中使用的数据都是保存在内存中的,是临时的,无法永久保存,每次启动程序都是从数据的初始化开始重新进行。而有时,我们希望程序的数据是上一次运行的结果,这时就需要将数据保存到外存中,即需要程序从文件中读取信息或把信息写入文件。C 提供了强大的文件通信方法,可以在程序中打开文件,然后使用特殊的 I/O 函数读取文件中的信息或把信息写入文件。在研究这些方法之前,先简要介绍一下文件的性质。1. 文件是什么?文件(file) 通常是在磁盘或固态硬盘上的一段已命名的存储区。对我们而言,stdio.h 就是原创 2021-10-06 19:38:41 · 366 阅读 · 0 评论 -
C 语言 —— ANSI C 类型限定符
我们通常用类型和存储类别来描述一个变量。C90 新增了两个属性: 恒常性(constancy)和易变性(volatility)。这两个属性可以分别用关键字 const 和 volatile 来声明,以这两个关键字创建的类型是限定类型(qualified type)。C99 标准新增了第 3 个限定符:restrict,用于提高编译器优化。C11 标准新增了第 4 个限定符:_Atomic。C11 提供一个可选库,由 stdatomic.h 管理,以支持并发程序设计,而且 _Atomic 是可选支持项。原创 2021-10-06 09:44:29 · 515 阅读 · 0 评论 -
C 语言 —— 基本概念
本文是《C 和指针》第 2 章的笔记。1. 环境在 ANSI C 的任何一种实现中,存在两种不同的环境。第一种是翻译环境,在这个环境里,源代码被转换为可执行的机器指令。第二种是执行环境,它用于实际执行代码。标准明确说明,这两种环境不必位于同一台机器上。例如,交叉编译器就是在一台机器上运行,但它产生的可执行代码运行于不同类型的机器上。操作系统也是如此。1.1. 翻译环境翻译阶段由几个步骤组成:组成一个程序的每个源文件通过编译器进行编译分别转换为目标代码。各个目标代码文件由链接器链接在一起,形成原创 2021-10-05 17:40:01 · 320 阅读 · 0 评论