C语言的高级用法学习总结

GCC介绍

格式

gcc [options] [filenames]

-c,只编译,不链接为可执行文件。生成.o文件
-o filename,输出文件。
-g,调试。
-O, -O2,对程序进行优化编译、链接。
-I dirname,将dirname所指出的目录加入到程序头文件目录列表中,实在预编译过程中使用的参数。
-L dirname,将dirname所指出的目录加到程序函数档案库文件目录列表中,是在链接过程中使用的参数。

GCC编译过程

1、预处理 .c >> .i
2、编译 .i >>.s
3、汇编 .s >> .o
4、链接 .o >> .exe

gcc -E test.c -o test.i: 将.c文件中的已#号开头的文件进行展开,条件编译生效。
gcc -S test.i -o test.s:生成汇编文件
gcc -c test.s -o test.o:生成对象文件
gcc test.o -o test -lm: 链接对象文件,生成可执行文件

调试器—Gdb调试流程

使用gcc对test.c进行调试,注意一定要加上选项 ‘-g’

格式:

gcc -g test.c -o test

gdb test

调试命令
1、一般先用 l 查看程序,默认显示十行,在输入一次l,显示下一个十行。 l n:命令回到第n行。
2、设置断点。(用info b可以查看断点设置情况)(del 1 删除第一个断点,del 3 删除第三个断点)
3、运行到断点,r
4、查看变量 p
5、单步运行 n

C语言提高

条件编译

#if <macro>

......

#else

......

#endif

实例:

#define _DEBUG_ 1
if _DEBUG_
printf("The macro _DEBUG_ is defined\n");
#else
printf("The macro _DEBUG_ is not defined\n");
#endif

结构体

将不同类型的数据互相联系构成一个整体即是结构体

struct 结构体名
{
    数据类型    成员名1;
    数据类型 成员名2;
    ..
    ..
    数据类型 成员名n;
};

特点

结构体成员名可以与程序中的变量名相同,二者并不代表同一对象。
1、结构体类型是用户自行构造的
2、它由若干个不同的基本数据类型的数据构成
3、它属于C语言的一种数据类型,与整型、实型相当。因此,定义它时不分配空间,只有用它定义变量时才分配空间
4、一般写到全局变量处,方便整个程序能调用。

举例

第一种方法

//职工信息
struct worker
{
    long number;
    char name[20];
    char sex;
    int age;
    float salary;
    char address[80];
};
int main()
{
    struct worker worker1, worker2;
    return 0;
}

第二种方法,在定义结构体时定义变量

struct worker
{
    long number;
    char name[20];
    char sex;
    int age;
    float salary;
    char address[80];
}worker1, worker2;
 

第三种方法,不定义结构体名字,直接定义变量

struct
{
    long number;
    char name[20];
    char sex;
    int age;
    float salary;
    char address[80];
}worker1, worker2;

初始化

// 第一种方法
struct 结构体名 变量名 = {初始数据表};

//第二种
struct 结构体名
{

}变量名 = {初始数据表};

 大小

一个结构体变量占内存的实际大小,可以用sizeof求出。它的运算表达式为:
sizeof(struct worker)
sizeof(worker1)

 注意

1、内存对齐问题!!
2、结构体可以嵌套。
3、在数组中,数组是不能够彼此赋值的,而结构体类型变量可以相互赋值。(前提是:两个是同一结构体类型的结构体变量)

worker2 = worker1 //是正确的

结构体的嵌套

struct birthday{
    int year;
    int month;
    int day;
}
struct
{
    long number;
    char name[20];
    char sex;
    struct birthday age;
    float salary;
    char address[80];
}

结构体数组


具有相同结构体类型的结构体变量可以组成数组,称它们为结构体数组。结构体数组的每一个结构体院上诉都是结构体类型的数据,它们都分别包括各个成员项。

// 第一种方法
struct student
{
    char name[20];
    char sex;
    int age;
    char addr[20];
};
struct student stu[3];

// 第二种方法
struct student
{
    char name[20];
    char sex;
    int age;
    char addr[20];
}stu[3];

// 第三种方法
struct 
{
    char name[20];
    char sex;
    int age;
    char addr[20];
}stu[3];

结构体指针

可以设定一个指针变量用来指向一个结构体变量。此时该指针变量的值是结构体变量的起始地址,该指针称为结构体指针。
结构体指针和前面介绍的各种指针在特性和方法上是相同的。与前述相同,在程序中结构体指针也是通过“*”来访问他对象。

struct 结构体名 * 结构指针名;
//其中结构体名必须是已经定义过的结构体变量

获取结构体成员

//第一种方法
(*p).name
//第二种方法
p->name

共用体

不同数据类型的数据可以使用共同的存储区域,这种数据构造类型称为共用体,又称联合体。共用体在定义、说明和使用形式上与结构体相似。两者本质上的不同仅在于使用内存的方式上。
一般形式为:

union 共用体名
{
    数据类型  成员列表;
};

这里定义一个共用体类型union gy,它由三个成员组成,这三个成员在内存中使用共同的存储空间。由于共用体内各成员的数据长度往往不同,所以共用体变量在存储时总是按其成员中数据长度最长的成员占用内存空间。

union gy
{
    int i;
    char c;
    float f;
};

typedef

typedef <已有数据类型>     <新数据类型>;

//如下  
typedef int INTEGER
//等价于 int i
INTEGER i;

typedef与结构体相结合

typedef struct _node_
{
    int data;
    struct _node_ *next;    // 自引用要定义成指针变量
} listnode, *linklist

//其中listnode等价于struct _node_, 而linklist等价于struct _node_ *

内存管理

动态内存
C/C++定义了4个内存区间:

代码区
全局变量与静态变量区
局部变量区,即栈区
动态存储区,即堆区


静态存储分配

通常定义变量,编译器在编译时可以根据该变量的类型知道所需的内存空间大小,从而系统在适当的时候为他们分配确定的存储空间。

在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束会这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。

动态存储分配

有些操作对象要在程序运行时才能确定,系统根据运行时的要求进行内存分配,这种方法称为动态存储分配
动态存储分配都在堆中进行
从堆上分配,亦称动态内存分配。程序在运行的时候使用malloc申请任意多少的内存,程序员自己负责在何时用free释放内存。动态内存的生存期由程序员决定。
malloc/free

 
void * malloc(size_t num)
void free(void *p)

注意

1、malloc申请到的是一块连续的内存,有时会申请不到内存,返回NULL。
2、malloc返回值的类型是void *,所以在调用malloc时要显式地进行类型转换,将void * 转换成所需要的类型。
3、free释放一块内存中的一部分是不被允许的。
4、删除一个指针,(free§)实际意思是删除了p所指向的目标,释放堆空间后,p成了空悬指针。
 

举例

例子2:编写获取一个字符串的函数

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
C语言教程(原书第4版) 《c语言教程(原书第4版)》是一本优秀的c程序设计语言教材,完整描述了ansi c语言及其语法特性,并对c语言高级特性和应用作了深入阐述,介绍了从c到c++和java过渡的相关知识。《c语言教程(原书第4版)》的一个鲜明特色就是结合大量示例描述c语言的重要特征,并对很多工作代码给出了逐步的分析,以这种独特的教学方法向读者解释新接触的编程元素及一些惯用法。   《c语言教程(原书第4版)》系统、完整,可作为c语言的参考手册,也非常适合作为学习c语言的入门和高级课程教材。 前言 第0章 从零开始 0.1 为什么要用c 0.2 ansi c标准 0.3 从c到c++ 0.4 从c和c++到java 第1章 c语言概述 1.1 编程和预备知识 1.2 程序输出 1.3 变量、表达式和赋值 1.4 使用#define和#include 1.5 使用printf()和scanf() 1.6 控制流 1.7 函数 1.8 数组、字符串和指针 1.8.1 数组 1.8.2 字符串 1.8.3 指针 1.9 文件 1.10 与操作系统有关的内容 1.10.1 编写和运行c程序 1.10.2 中断程序 1.10.3 输入文件尾标志 1.10.4 输入和输出的重定向 1.11 总结 1.12 练习 第2章 词法元素、操作符和c系统 2.1 字符和词法元素 2.2 语法规则 2.3 注释 2.4 关键字 2.5 标识符 2.6 常量 2.7 字符串常量 2.8 操作符和标点符号 2.9 操作符的优先级和结合性 2.10 增值操作符和减值操作符 2.11 赋值操作符 2.12 例子:计算2的乘方 2.13 c系统 2.13.1 预处理器 2.13.2 标准函数库 2.14 总结 2.15 练习 第3章 基本数据类型 3.1 声明、表达式和赋值 3.2 基本数据类型 3.3 字符和char数据类型 3.4 int数据类型 3.5 整数类型short、long和unsigned 3.6 浮点类型 3.7 typedef的用法 3.8 sizeof操作符 3.9 使用getchar()和putchar() 3.10 数学函数 3.10.1 使用abs()和fabs() 3.10.2 unix和数学函数库 3.11 隐式类型转换和强制类型转换 3.11.1 整型提升 3.11.2 寻常算术转换 3.11.3 强制类型转换 3.12 十六进制和八进制常量 3.13 总结 3.14 练习 第4章 控制流 4.1 关系操作符、相等操作符和逻辑操作符 4.2 关系操作符和表达式 4.3 相等操作符和表达式 4.4 逻辑操作符和表达式 4.5 复合语句 4.6 表达式和空语句 4.7 if和if-else语句 4.8 while语句 4.9 for语句 4.10 例子:布尔变量 4.11 逗号操作符 4.12 do语句 4.13 例子:斐波那契数 4.14 goto语句 4.15 break和continue语句 4.16 switch语句 4.17 条件操作符 4.18 总结 4.19 练习 第5章 函数 5.1 函数定义 5.2 return语句 5.3 函数原型 5.4 例子:创建乘方表 5.5 从编译器的角度观察函数原型 5.6 函数定义顺序的另一种风格 5.7 函数调用和传值调用 5.8 开发大型程序 5.9 使用断言 5.10 作用域规则 5.10.1 平行和嵌套代码块 5.10.2 以调试为目的使用代码块 5.11 存储类型 5.11.1 auto存储类型 5.11.2 extern存储类型 5.11.3 register存储类型 5.11.4 static存储类型 5.12 静态外部变量 5.13 默认初始化 5.14 递归 5.15 例子:汉诺塔 5.16 总结 5.17 练习 第6章 数组、指针和字符串 6.1 一维数组 6.1.1 初始化 6.1.2 下标 6.2 指针 6.3 传引用调用 6.4 数组和指针之间的关系 6.5 指针运算和元素的大小 6.6 数组作为函数的实参 6.7 例子:冒泡排序 6.8 用calloc()和malloc()进行动态内存分配 6.9 例子:归并和归并排序 6.10 字符串 6.11 标准函数库中的字符串处理函数 6.12 多维数组 6.12.1 二维数组 6.12.2 存储映射函数 6.12.3 形式参数声明 6.12.4 三维数组 6.12.5 初始化 6.12.6 使用typedef 6.13 指针数组 6.14 main()函数的参数 6.15 不规则数组 6.16 函数作为参数 6.17 例子:使用二分法寻找函数的根 6.18 函数指针数组 6.19 类型限定符const和volatile 6.20 总结 6.21 练习 第7章 位操作符和枚举类型 7.1 位操作符和表达式 7.1.1 按位求反 7.1.2 补码 7.1.3 位逻辑操作符 7.1.4 左移位和右移位操作符 7.2 掩码 7.3 软件工具:打印int值的二进制形式 7.4 包装和解包 7.5 枚举类型 7.6 例子:“石头、剪刀、布”游戏 7.7 总结 7.8 练习 第8章 预处理器 8.1 #include的使用 8.2 使用#define 8.3 带参数的宏 8.4 stddef.h中的类型定义和宏 8.5 例子:用qsort()进行排序 8.6 例子:带参数的宏 8.7 stdio.h和ctype.h中的宏 8.8 条件编译 8.9 预定义的宏 8.10 “#”和“##”操作符 8.11 assert()宏 8.12 使用#error和#pragma 8.13 行号 8.14 对应的函数 8.15 例子:快速排序 8.16 总结 8.17 练习 第9章 结构和联合 9.1 结构 9.2 访问结构成员 9.3 操作符的优先级和结合性的总结 9.4 在函数中使用结构 9.5 结构的初始化 9.6 例子:玩扑克牌 9.7 联合 9.8 位字段 9.9 例子:访问位和字节 9.10 adt堆栈 9.11 总结 9.12 练习 第10章 结构和列表处理 10.1 自引用的结构 10.2 线性链表 10.3 链表操作 10.4 一些链表处理函数 10.4.1 插入 10.4.2 删除 10.5 堆栈 10.6 例子:波兰记法和堆栈求值 10.7 队列 10.8 二叉树 10.8.1 二叉树的遍历 10.8.2 创建树 10.9 普通的树 10.9.1 遍历 10.9.2 calloc()的用法以及树的创建 10.10 总结 10.11 练习 第11章 输入/输出和操作系统 11.1 输出函数printf() 11.2 输入函数scanf() 11.3 fprintf()、fscanf()、sprintf() 和sscanf()函数 11.4 fopen()和fclose()函数 11.5 例子:对文件进行空间加倍 11.6 使用临时文件和优雅函数 11.7 随机访问文件 11.8 文件描述符输入/输出 11.9 文件访问权限 11.10 在c程序内部执行命令 11.11 在c程序内部使用管道 11.12 环境变量 11.13 c编译器 11.14 使用性能评估程序 11.15 函数库 11.16 对c代码进行计时 11.17 使用make 11.18 使用touch 11.19 其他有用的工具 11.20 总结 11.21 练习 第12章 高级应用 12.1 用fork()创建并发进程 12.2 进程的叠加:exec...()函数族系 12.3 使用pipe()实现进程间的通信 12.4 信号 12.5 例子:哲学家用餐问题 12.6 矩阵的动态分配 12.6.1 为什么二维数组无法满足要求 12.6.2 用指针数组创建矩阵 12.6.3 调整下标范围 12.6.4 一次分配所有内存 12.7 返回状态 12.8 总结 12.9 练习 第13章 从c到c++ 13.1 输出 13.2 输入 13.3 函数 13.4 类和抽象数据类型 13.5 重载 13.6 构造函数和析构函数 13.7 面向对象编程和继承 13.8 多态 13.9 模板 13.10 c++的异常 13.11 面向对象编程的优点 13.12 总结 13.13 练习 第14章 从c到java 14.1 输出 14.2 变量和类型 14.3 类和抽象数据类型 14.4 重载 14.5 类的创建和销毁 14.6 面向对象编程和继承 14.7 多态和重写方法 14.8 applet 14.9 java的异常 14.10 java和oop的优势 14.11 总结 14.12 练习 附录a 标准函数库 附录b c的语法 附录c ansi c与传统c的比较 附录d ascii字符码 附录e 操作符的优先级和结合性
avm是一个基于system verilog和systemc编程环境。它是为了开发复杂验证平台而设计的。就如学习c语言一样(或者system verilog或者systemc),它会需要一段时间去学习avm,从而知道如何更有效地去应用所有的概念。这本书的目的就是给你一个信心。如果这本书的作者把工作做得相当好,那么当你阅读这本书并且按里面的例子进行练习,肯定会有惊喜的体验。这个比喻性的概念在你的思想形成之后,你就会掌握avm中所有的结构并且知道如何应用。 目录 绪论 第1章 验证原理 1.1 验证基础 1.2 第一个验证平台 1.3 第二个验证平台 1.4 总结 第2章 avm综述 2.1 重用 2.2 验证组件和接口 2.3 层次化结构的验证平台 2.4 两个域 2.5 基于systemverilog avm概述 2.6 总结 第3章 面向对象程序设计的基本原理 3.1 面向过程vs.面向对象 3.2 类和对象 3.3 对象间关系 3.4 虚函数和多态 3.5 通用程序设计 3.6 作为组件的对象 . 3.7 oop和验证 第4章 tlm介绍 4.1 抽象(abstraction) 4.2 事务的定义(definilion of a transaction) 4.3 组件间的通信(communicating comf)onents) 4.4 使用通道(channel)来隔离组件 4.5 事务级连接(forming a transation—level connection) 4.6 小结 第5章 sustem vererilog中的avm机制 5.1 接口 5.2 连接组件 5.3 创建环境 5.4 连接硬件 5.5 报告 5.6 总结 第6章 验证平台基础 6.1 一个简单的存储器设计 6.2 激励产生器 6.3 监视器 6.4 三类状态机 6.5 驱动器 6.6 总结 第7章 完整的验证平台 7.1 分析端口和分析组件 7.2 记分板 7.3 覆盖率 7.4 注入错误 7.5 总结 第8章 逐步优化 8.1 事务级设计 8.2 riil替换 8.3 fpu作为黄金模型 8.4 小结 第9章 验证平台中的模块 9.1 非流水型总线实例 9.2 基于模块的断言监视器 9.3 总线功能模型(bfm) 9.4 总结 第10章 随机验证 10.1 crv方法概述 10.2 对类加入随机 10.3 用继承来实现层次约束 10.4 动态修改约束 10.5 过度约束 10.6 设定成员 10.7 动态数组 10.8 每个设计/每个测试配置 10.9 约束设计 10.10 类工厂 10.11 状态决定约束实例 10.12 avm随机激励生成器 第11章 avm与system verilog和sustemc 11.1 对象模型 11.2 对象的支持 11.3 封装行为 11.4 随机化 11.5 实例化与细节构建 11.6 事务级连接 11.7 执行阶段 11.8 创建完整的验证平台架构 11.9 选择systemverilog或systemc 附录a 符号说明 附录b 命名约定 附录c avm百科全书 附录d apache许可证 参考书目

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值