15-C语言结构体(转载)
目录:
一、大型软件开发
将一个代码中的内容,拆分成多个文件,最后的可执行文件只要一个。
操作步骤:
1 原来只有一个文件main.c输入函数 输出函数 声明
2 多人开发 将原文件拆成三个文件,分别为*.h、*c、main.c
3 编译时
1)分别编译不同的源文件,生成相应的目标文件
gcc -c input.c
gcc -c main.c
2)可以将多个目标文件链接生成同一个可执行文件
gcc input.o main.o => a.out
3)在main.c中,引入头文件
4).h文件中的条件编译解决的是重复声明问题
5)先xcode中,Compile Sources解决链接问题的根本
总结:如果使用第三方代码,要做两件事情,导入.h文件,导入目标文件.o(库)
main.c
1 #include <stdio.h> 2 #include "header.h" 3 4 extern int g_num; 5 int main(int argc, const char * argv[]) 6 { 7 int i = 0; 8 i = input(); 9 printf("i:%d\n",i); 10 printf("g_num:%d\n",getNum()); 11 return 0; 12 }
header.h声明代码:
1 #ifndef _______header_h 2 #define _______header_h 3 4 int input(); 5 int getNum(); 6 #endif
input.c实现代码:
1 #include <stdio.h> 2 static int g_num = 10;//用static修饰只能在本文件中访问 3 int input() 4 { 5 int i = 0; 6 printf("输入一个数:\n"); 7 scanf("%d",&i); 8 return i; 9 } 10 int getNum() 11 { 12 return g_num; 13 }
二、头文件和static
1 以.h结尾的文件就是头文件
2 未使用内存空间的内容都可以放到头文件中,声明变量可能有问题(因为开辟了存储空间),将要使用函数的声明放在头文件中,方便使用函数,如果函数声明变更,则只需要修改头文件的内容,而不需要修改源代码。
3 如果在一个项目中共享全局变量,在使用的文件中,使用extern关键字,声明变量,才可以使用,并且可以得到全局变量的值。
4 全局变量前加上static修饰,只能在本文件中使用。
static也可以修饰函数,加了static的变量,就是私有变量,加了static的函数,就是私有函数。
三、结构体
1 在C 中可以使用结构体定义用户自定义的类型,但结构成员类型可以不一样,
2 格式:
struct 结构体名{
成员;
}变量名;
struct student{
int age;
char name[20];
}student1,student2;
3 如果结构体的成员是字符串,是不能通过=号进行赋值,要使用strcpy(student1.name,"zhangsan")
4结构体的定义不占用内存空间,可以把结构体放到头文件中,项目中的其他文件就可以使用该类型。
5 如果是基本数据类型,使用结构类型的变量.成员,可以操作该成员。
6 声明结构体类型的变量,占用空间是所有成员变量所占空间之和。
7 如果使用结构体变量赋值,相当于将结构体中每一个成员的值,都赋值给新的结构体变量的成员。
练习:定义一个学生结构体,学号、姓名、年龄、性别(F、M),创建三个学生,输入信息,并输出。(数组)
1 #include <stdio.h> 2 #include <string.h> 3 /* 4 //如果结构体声明到外面,就变成全局变量 5 //2.定义结构体类型 6 struct student{ 7 int age;//成员 8 char name[20]; 9 }; 10 struct student student1 = {18,"zhangsan"},student2 = {19,"lisi"};//struct student是结构体类型,student1是结构体变量 11 */ 12 13 //typedef起别名 14 //3.定义结构体类型(在以后的编程中通常使用这种) 15 typedef struct{ 16 int age;//成员 17 char name[20]; 18 }student; 19 20 /* 21 练习:定义一个学生结构体,学号、姓名、年龄、性别(F、M),创建三个学生,输入信息,并输出。 22 */ 23 //定义学生结构体 24 typedef struct{ 25 int xuehao; 26 char name[20]; 27 int age; 28 char sex; 29 }student; 30 31 int main(int argc, const char * argv[]) 32 { 33 /* 34 //1.定义结构体类型 35 struct{ 36 int age;//成员 37 char name[20]; 38 }student1 = {18,"zhangsan"},student2 = {19,"lisi"};//student1声明结构体变量 39 */ 40 student student1 = {14,"san"};//student是结构体类型,student1是结构体变量名 41 student student2 = student1;//如果使用结构体变量赋值,相当于将结构体中每一个成员的值,都赋值给新的结构体变量的成员。 42 student1.age = 22; 43 strcpy(student1.name,"zhangsan");//给name赋值 44 printf("student1 name:%s,age:%d\n",student1.name,student1.age); 45 printf("student2 name:%s,age:%d\n",student2.name,student2.age); 46 47 //作业 48 student students[3]; 49 for (int i = 0; i < 3; i++) { 50 printf("输入学生信息:\n"); 51 printf("姓名:\n"); 52 fgets(students[i].name, 20, stdin); 53 printf("年龄:\n"); 54 scanf("%d",&students[i].age); 55 for (int i = 0; i < 3; i++) { 56 printf("输入学生信息:\n"); 57 printf("姓名:%s\n",students[i].name); 58 printf("年龄:%d\n",students[i].age); 59 } 60 } 61 return 0; 62 }
四、联合
1 联合的用法、语法和结构非常相似,但联合中所有成员分配的内存是同一块。(只保存一个成员的信息,联合的空间以最大成员所占的空间为值)
2 联合可以用一块内存对应多种数据类型
3 联合与结构体的区别:
结构可以保存多个成员信息,而联合只能保存一个成员信息且是最后一个。
1 #include <stdio.h> 2 #include <string.h> 3 4 //定义联合类型 5 typedef union{ 6 int age; 7 char name[2]; 8 }LianHe; 9 int main(int argc, const char * argv[]) 10 { 11 LianHe lh; 12 lh.age = 18; 13 printf("lh age:%d\n",lh.age); 14 strcpy(lh.name, "zh"); 15 printf("lh name:%s\n",lh.name); 16 printf("lh age:%d\n",lh.age); 17 printf("lh name:%s\n",lh.name); 18 lh.age = 22; 19 printf("lh age:%d\n",lh.age); 20 printf("lh name:%s\n",lh.name); 21 return 0; 22 }
五、枚举
1 用字母来描述一组有规律的数值。
2 定义一个枚举
enum{SBR,SUM,AUT,WIN};
3 枚举默认值从0开始,每个值都是整型常量
4 只能在声明枚举时修改枚举值
5 修改枚举值之后的那个枚举值 = 修改的那个枚举值加1
练习:输入一个数字,得到相应的季节
1 #include <stdio.h> 2 enum{SBR,SUM=5,AUT,WIN}; 3 int main(int argc, const char * argv[]) 4 { 5 printf("%d\n",SBR); 6 printf("%d\n",SUM); 7 printf("%d\n",AUT); 8 printf("%d\n",WIN); 9 return 0; 10 }