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
#include <stdio.h>
#include "header.h" extern int g_num;
int main(int argc, const char * argv[])
{
int i = ;
i = input();
printf("i:%d\n",i);
printf("g_num:%d\n",getNum());
return ;
}
header.h声明代码:
#ifndef _______header_h
#define _______header_h int input();
int getNum();
#endif
input.c实现代码:
#include <stdio.h>
static int g_num = ;//用static修饰只能在本文件中访问
int input()
{
int i = ;
printf("输入一个数:\n");
scanf("%d",&i);
return i;
}
int getNum()
{
return g_num;
}
二、头文件和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),创建三个学生,输入信息,并输出。(数组)
#include <stdio.h>
#include <string.h>
/*
//如果结构体声明到外面,就变成全局变量
//2.定义结构体类型
struct student{
int age;//成员
char name[20];
};
struct student student1 = {18,"zhangsan"},student2 = {19,"lisi"};//struct student是结构体类型,student1是结构体变量
*/ //typedef起别名
//3.定义结构体类型(在以后的编程中通常使用这种)
typedef struct{
int age;//成员
char name[];
}student; /*
练习:定义一个学生结构体,学号、姓名、年龄、性别(F、M),创建三个学生,输入信息,并输出。
*/
//定义学生结构体
typedef struct{
int xuehao;
char name[];
int age;
char sex;
}student; int main(int argc, const char * argv[])
{
/*
//1.定义结构体类型
struct{
int age;//成员
char name[20];
}student1 = {18,"zhangsan"},student2 = {19,"lisi"};//student1声明结构体变量
*/
student student1 = {,"san"};//student是结构体类型,student1是结构体变量名
student student2 = student1;//如果使用结构体变量赋值,相当于将结构体中每一个成员的值,都赋值给新的结构体变量的成员。
student1.age = ;
strcpy(student1.name,"zhangsan");//给name赋值
printf("student1 name:%s,age:%d\n",student1.name,student1.age);
printf("student2 name:%s,age:%d\n",student2.name,student2.age); //作业
student students[];
for (int i = ; i < ; i++) {
printf("输入学生信息:\n");
printf("姓名:\n");
fgets(students[i].name, , stdin);
printf("年龄:\n");
scanf("%d",&students[i].age);
for (int i = ; i < ; i++) {
printf("输入学生信息:\n");
printf("姓名:%s\n",students[i].name);
printf("年龄:%d\n",students[i].age);
}
}
return ;
}
四、联合
1 联合的用法、语法和结构非常相似,但联合中所有成员分配的内存是同一块。(只保存一个成员的信息,联合的空间以最大成员所占的空间为值)
2 联合可以用一块内存对应多种数据类型
3 联合与结构体的区别:
结构可以保存多个成员信息,而联合只能保存一个成员信息且是最后一个。
#include <stdio.h>
#include <string.h> //定义联合类型
typedef union{
int age;
char name[];
}LianHe;
int main(int argc, const char * argv[])
{
LianHe lh;
lh.age = ;
printf("lh age:%d\n",lh.age);
strcpy(lh.name, "zh");
printf("lh name:%s\n",lh.name);
printf("lh age:%d\n",lh.age);
printf("lh name:%s\n",lh.name);
lh.age = ;
printf("lh age:%d\n",lh.age);
printf("lh name:%s\n",lh.name);
return ;
}
五、枚举
1 用字母来描述一组有规律的数值。
2 定义一个枚举
enum{SBR,SUM,AUT,WIN};
3 枚举默认值从0开始,每个值都是整型常量
4 只能在声明枚举时修改枚举值
5 修改枚举值之后的那个枚举值 = 修改的那个枚举值加1
练习:输入一个数字,得到相应的季节
#include <stdio.h>
enum{SBR,SUM=,AUT,WIN};
int main(int argc, const char * argv[])
{
printf("%d\n",SBR);
printf("%d\n",SUM);
printf("%d\n",AUT);
printf("%d\n",WIN);
return ;
}
15-C语言结构体的更多相关文章
- c语言结构体
[C语言]21-结构体 本文目录 一.什么是结构体 二.结构体的定义 三.结构体变量的定义 四.结构体的注意点 五.结构体的初始化 六.结构体的使用 七.结构体数组 八.结构体作为函数参数 九.指向结 ...
- 读陈浩的《C语言结构体里的成员数组和指针》总结,零长度数组
原文链接:C语言结构体里的成员数组和指针 复制例如以下: 单看这文章的标题,你可能会认为好像没什么意思.你先别下这个结论,相信这篇文章会对你理解C语言有帮助.这篇文章产生的背景是在微博上,看到@Lar ...
- 06. Go 语言结构体
Go语言结构体(struct) Go 语言通过用自定义的方式形成新的类型,结构体是类型中带有成员的复合类型.Go 语言使用结构体和结构体成员来描述真实世界的实体和实体对应的各种属性. Go 语言中的类 ...
- 漫谈C语言结构体struct、公用体union空间占用
先用代码说话: #include<stdio.h> union union_data0{ int a ;//本身占用4个字节 char b ;//本身占用1个字节 int c ; }; u ...
- 解析C语言结构体对齐(内存对齐问题)
C语言结构体对齐也是老生常谈的话题了.基本上是面试题的必考题.内容虽然很基础,但一不小心就会弄错.写出一个struct,然后sizeof,你会不会经常对结果感到奇怪?sizeof的结果往往都比你声明的 ...
- 不可或缺 Windows Native (8) - C 语言: 结构体,共用体,枚举,类型定义符
[源码下载] 不可或缺 Windows Native (8) - C 语言: 结构体,共用体,枚举,类型定义符 作者:webabcd 介绍不可或缺 Windows Native 之 C 语言 结构体 ...
- Go语言结构体(struct)
Go 语言结构体 Go 语言中数组可以存储同一类型的数据,但在结构体中我们可以为不同项定义不同的数据类型. 结构体是由一系列具有相同类型或不同类型的数据构成的数据集合. 结构体表示一项记录,比如保存图 ...
- C语言结构体定义的几种方法
什么是结构体? 在C语言中,结构体(struct)指的是一种数据结构,是C语言中聚合数据类型(aggregate data type)的一类.结构体可以被声明为变量.指针或数组等,用以实现较复杂的数据 ...
- 对嵌入式开发C语言结构体的一点总结
今天冬至居然不上班,公司的良心啊!这回有心情写博客和日志了,好了,废话不多说.直接看下文: 鉴于嵌入式开发过程中,C语言结构体的使用当然是必不可少.话说,基础什么的比你会更牛逼的算法更重要,基础不牢, ...
- C语言结构体变量私有化
操作系统 : CentOS7.3.1611_x64 gcc版本 :4.8.5 问题描述 C语言结构体定义中的变量默认是公有(Public)属性,如果实现成员变量的私有(Private)化? 解决方案 ...
随机推荐
- jsp相对路径和绝对路径小谈
很长一段时间纠结过JSP中的相对路径和绝对路径,也研究过一段时间,今天趁着有点时间,记下来,也有大家分享一下. 1)我们先来理解一下相对路径 首先还是我们的开始,建一个WEB项目,只是测试一下而已,名 ...
- Sql Server 2008开发版(Developer Edition)过期升级企业版(Enterprise Edition)失败后安装学习版(Express Edition)
最近一个多月,甚是悠哉,无事可做.上线的网站系统也没接到客户的反馈,反而觉得无聊之极了.上周五早上,一上QQ,就收到客户发来消息,管理平台无法登陆了.心里一惊,立马开始查找故障原因.翻看了系统日志,提 ...
- 性能监控工具javamelody与spring的集成
详细信息可以访问javamelody的官方网站 我在集成的过程中,一直出现commonHibernateDao的加载问题, 另外,根据官方文档,如果你的应用与monitoring-spring.xml ...
- Python核心编程读笔 5: python的序列
第六章 序列:字符串.列表.元组 一.序列 (1)序列类型操作符 seq[ind] 获得下标为 ind 的元素 seq[ind1:ind2] 切片操作 seq * expr 序列重复 expr 次 s ...
- Opencv 完美配置攻略 2014 (Win8.1 + Opencv 2.4.8 + VS 2013)上
下载安装软件 下载 Opencv for Windows 最新版本,本文是 Opencv 2.4.8.双击后会出现解压提示,实际上就是“安装”了,路径填写为 D:/Program Files,然后确定 ...
- Java提高学习之Object(4)
哈希码 问: hashCode()方法是用来做什么的? 答: hashCode()方法返回给调用者此对象的哈希码(其值由一个hash函数计算得来).这个方法通常用在基于hash的集合类中,像java. ...
- keyDown keyPress keyUp 事件的区别
keyDown keyPress keyUp 事件的区别 一 触发顺序 显而易见,事件发生的顺序是: keydown --> keypress --> keyup 当按住一个键一段时间后 ...
- scanf和gets的区别
scanf和gets获取字符串时的区别 在C语言中,能构获取字符串的函数至少有两个: 1.scanf() 所在头文件:stdio.h 语法:scanf("格式控制字符串" ...
- 【Chromium中文文档】Chromium多进程架构
多进程架构 转载请注明出处:https://ahangchen.gitbooks.io/chromium_doc_zh/content/zh//Start_Here_Background_Readin ...
- 20.org.hibernate.StaleStateException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1
org.hibernate.StaleStateException: Batch update returned unexpected row count from update [0]; actua ...