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:编写获取一个字符串的函数
C语言的高级编程(一)相关推荐
- c语言的高级编程,C语言高级编程
Q:如何提问,能得到快速的解答? A: 1)标题:撰写标题时,要注意把要问的问题的出处和核心词写出来,最好用[]标出来,比如[第1周编程题在线测试的第1题]求解. 2)内容:内容上要把你不懂的地方说出 ...
- Go 学习推荐 —(Go by example 中文版、Go 构建 Web 应用、Go 学习笔记、Golang常见错误、Go 语言四十二章经、Go 语言高级编程)
Go by example 中文版 Go 构建 Web 应用 Go 学习笔记:无痕 Go 标准库中文文档 Golang开发新手常犯的50个错误 50 Shades of Go: Traps, Gotc ...
- 鼠标绘图 c语言,c语言高级编程技术教程 图形显示方式与鼠标输入.doc
c语言高级编程技术教程 图形显示方式与鼠标输入 c语言高级编程技术教程 图形显示方式和鼠标输入 图形显示方式和鼠标输入 问题的提出编写程序,使用鼠标进行如下操作:按住鼠标器的任意键并移动,十字光 标将 ...
- 【嵌入式】C语言高级编程-可变参数宏(12)
00. 目录 文章目录 00. 目录 01. 可变参数宏概述 02. ##符号 03. 可变参宏另外一种写法 04. 内核中的可变参数宏 05. 附录 01. 可变参数宏概述 #include < ...
- 【嵌入式】C语言高级编程-内建函数(11)
00. 目录 文章目录 00. 目录 01. 内建函数概述 02. 常用内建函数 03. C 标准库的内建函数 04. 内核中的 likely 和 unlikely 05. 附录 01. 内建函数概述 ...
- 【嵌入式】C语言高级编程-内联函数(10)
00. 目录 文章目录 00. 目录 01. 属性声明 02. 内联函数概述 03. 内联函数与宏 04. 编译器对内联函数的处理 05. static修饰内联函数 06. 附录 01. 属性声明 a ...
- 【嵌入式】C语言高级编程-强符号和弱符号(09)
00. 目录 文章目录 00. 目录 01. weak属性 02. 变量强符号和弱符号 03. 函数强符号和弱符号 04. 弱符号的作用 05. alias属性 06. 附录 01. weak属性 G ...
- 【嵌入式】C语言高级编程-变参函数(08)
00. 目录 文章目录 00. 目录 01. format属性声明 02. 变参函数的设计思路 03. 变参函数宏 04. 应用示例 05. 附录 01. format属性声明 GNU 通过 attr ...
- 【嵌入式】C语言高级编程-地址对齐(07)
00. 目录 文章目录 00. 目录 01. 数据对齐概述 02. 数据需要对齐的原因 03. 属性声明: aligned 04. 结构体对齐 05. 附录 01. 数据对齐概述 一般情况下,当我们定 ...
最新文章
- JFreeChart_API
- Python之旅.第四章.模块与包
- 【自定义注解使用】增加service层方法访问日志
- C语言二叉树曲折级顺序遍历(附完整源码)
- oracle怎么查询模式名,oracle怎么查询数据库实例的三种方式
- java csv to list_java – 如何轻松地将CSV文件处理为List
- 【shell】Shell脚本的学习笔记
- JDK的环境变量配置(步骤超级简单)
- w7计算机应用放大按键,设置Win7放大功能 老年人用电脑更方便
- java语言编译系统_请问C语言,JAVA之类的语言编译程序是属于 系统软件 还是 应用软件??...
- 全国各省手机号测试用例
- 苹果App Store审核指南中文翻译
- 物联网识别技术期末复习概要
- 注定平凡-----和will812
- php sphinx应用场景,Sphinx+Scws 搭建千万级准实时搜索应用场景详解
- 一个计算机网络题目——给局域网分配合适的网络前缀。
- 不知道如何提高视觉语言大模型?浙大与联汇研究院提出新型多维度评测框架...
- Redis升级到 6.x 版本后,12306网站起飞了!
- 【最经典的79个】软件测试面试题(内含答案)都是可以提前准备的!
- 视频教程-项目2——在线无忧库存预警系统-Java