gcc [options] [filenames]
-c,只编译,不链接为可执行文件。生成.o文件
-o filename,输出文件。
-g,调试。
-O, -O2,对程序进行优化编译、链接。
-I dirname,将dirname所指出的目录加入到程序头文件目录列表中,实在预编译过程中使用的参数。
-L dirname,将dirname所指出的目录加到程序函数档案库文件目录列表中,是在链接过程中使用的参数。
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: 链接对象文件,生成可执行文件
gcc -g test.c -o test
gdb test
#if
......
#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 结构体名
{
}变量名 = {初始数据表};
注意:
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 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
void * malloc(size_t num)
void free(void *p)
注意:
1、malloc申请到的是一块连续的内存,有时会申请不到内存,返回NULL。
2、malloc返回值的类型是void *,所以在调用malloc时要显式地进行类型转换,将void * 转换成所需要的类型。
3、free释放一块内存中的一部分是不被允许的。
4、删除一个指针,(free§)实际意思是删除了p所指向的目标,释放堆空间后,p成了空悬指针。