标准C语言(11)
多文件编程时一个文件里可以包含多个函数,一个函数只能属于一个文件
/*
* 多文件编程演示
* */
#include <stdio.h>
#include "01add.h"
int main() {
int num = 0, num1 = 0;
printf("请输入两个数字:");
scanf("%d%d", &num, &num1);
printf("结果是%d\n", add(num, num1));
return 0;
}
/*
* 01add.h
*/ #ifndef __01ADD_H__
#define __01ADD_H__
int add(int, int);
#endif //__01ADD_H__
多文件编程基本步骤
1.把所有函数分散在多个不同的源文件里(主函数通常单独放在一个文件里)
2.为每个源文件编写以.h作为扩展名的配对头文件(主函数所在的源文件不需要配对头文件),只要不分配内存的内容都可以写在头文件里,头文件里至少要包含配对源文件里函数的声明语句
3.在每个源文件里使用#include预处理指令包含必要的头文件(配对头文件是必要头文件,如果源文件里使用了某个头文件里声明的函数,则这个头文件也是必要头文件)
在gcc命令里列出所有源文件的路径就可以编译多文件方式编写的程序
可以把多文件程序的编译过程记录在Makefile文件里,然后使用make工具进行编译
/*
*Makefile
*/ a.out : 01add.o 01main.o
gcc 01add.o 01main.o 01add.o : 01add.c
gcc -c 01add.c 01main.o : 01main.c
gcc -c 01main.c
头文件内容应该包含在条件编译的预处理指令中间,这样可以避免头文件内容被重复编译,第一个预处理指令必须是#ifndef
头文件里使用的宏名称应该根据文件名称变化得到,这样可以避免不同头文件使用同样的宏名称
如果想从一个源文件里使用另外一个源文件里声明的全局变量就需要使用extern关键字再次声明这个全局变量
使用extern关键字声明变量的语句通常写在头文件里,因为它不分配内存
不可以跨文件使用静态全局变量
结构体类型的存储区里可以存放多个不同类型的数字,结构体类型需要先创建出来然后才能使用,结构体类型的存储区里包含多个子存储区,每个子存储区可以用来记录一个数字.结构体类型存储区里各个子存储区的类型可以不同,甚至子存储区也可以是结构体类型的存储区.结构体声明语句可以用来创建结构体类型,结构体声明语句里需要使用struct关键字,结构体声明语句里包含多个变量声明语句,这些变量叫做结构体的成员变量,每个成员变量代表一个子存储区.成员变量的声明语句不会分配内存,它们只是用来表示子存储区的类型和名称.C语言里结构体不可以包含函数,结构体声明语句可以写在任何地方,包括头文件里可以把结构体作为类型声明变量,这种变量叫结构体变量,把结构体作为类型使用的时候需要把struct关键字和结构体名称一起作为类型名称使用,结构体变量被分配了内存,可以用来记录数字
typedef关键字可以用来给一个数据类型起别名,别名可以代替原有的类型名称使用,通常会给结构体类型起别名
/*
* 结构体演示
* */
#include <stdio.h>
/*struct person {
int age;
float height;
char name[10];
};
typedef struct person sperson;*/
typedef struct /*person*/ {
int age;
float height;
char name[10];
} sperson;
int main() {
//struct person prsn; //结构体变量
sperson prsn1 = {20, 1.78f, "abc"}, prsn2 = {0};
sperson *p_person = NULL; //结构体指针
printf("请输入年龄:");
scanf("%d", &(prsn1.age));
printf("请输入身高:");
scanf("%g", &(prsn1.height));
scanf("%*[^\n]");
scanf("%*c");
printf("请输入姓名:");
fgets(prsn1.name, 10, stdin);
printf("年龄是%d\n", prsn1.age);
printf("身高是%g\n", prsn1.height);
printf("姓名是%s\n", prsn1.name);
prsn2 = prsn1;
printf("年龄是%d\n", prsn2.age);
printf("身高是%g\n", prsn2.height);
printf("姓名是%s\n", prsn2.name);
p_person = &prsn1;
printf("年龄是%d\n", p_person->age);
printf("身高是%g\n", p_person->height);
printf("姓名是%s\n", p_person->name);
return 0;
}
可以把声明结构体的语句和起别名的语句合并成一条语句,这个时候可以省略结构体本身的名称
结构体变量应该进行初始化,可以象初始化数组一样初始化结构体变量,这个初始化过程也遵守数组初始化的各种规则
结构体变量通常不会作为整体使用,一般一次只使用其中的某个子存储区,以下写法可以表示结构体变量的某个子存储区
prsn.age
其中prsn是一个结构体变量的名称,age是一个子存储区的名称
同类型的结构体变量之间可以直接赋值
结构体指针可以记录结构体存储区的地址,以下写法可以通过结构体指针表示结构体的子存储区
p_person->age
其中p_person是一个结构体指针的名称,age是一个成员变量的名称
/*
* 结构体练习
* */
#include <stdio.h>
typedef struct {
int row;
int col;
} pt;
typedef struct {
pt pt1;
pt pt2;
} rect;
int main() {
pt mid = {0};
rect r = {0}, *p_r = &r;
/*printf("请输入水平长方形的位置:");
scanf("%d%d%d%d", &(r.pt1.row), &(r.pt1.col), &(r.pt2.row), &(r.pt2.col));
mid.row = (r.pt1.row + r.pt2.row) / 2;
mid.col = (r.pt1.col + r.pt2.col) / 2;
printf("中心点的位置是(%d, %d)\n", mid.row, mid.col);*/
printf("请输入水平长方形的位置:");
scanf("%d%d%d%d", &(p_r->pt1.row), &(p_r->pt1.col), &(p_r->pt2.row), &(p_r->pt2.col));
mid.row = (p_r->pt1.row + p_r->pt2.row) / 2;
mid.col = (p_r->pt1.col + p_r->pt2.col) / 2;
printf("中心点的位置是(%d, %d)\n", mid.row, mid.col);
return 0;
}
可以使用结构体类型的形式参数从调用函数向被调用函数传递结构体数据,直接使用结构体类型的形式参数会造成时间和内存的浪费,采用结构体指针做形式参数可以避免时间和内存的浪费,声明结构体指针形式参数的时候尽量使用const关键字
可以把整个结构体存储区的内容作为返回值使用,这个时候函数就需要提供一个结构体类型的存储区用来存放返回值,这样也会造成时间和内存的浪费,使用结构体存储区的地址做返回值可以避免这种浪费,这个时候就需要被调用函数提供一个结构体指针类型的存储区用来存放返回值,不可以把非静态局部结构体存储区的地址作为返回值使用
标准C语言(11)的更多相关文章
- 关于标准C语言的预定义宏【转】
标准C语言预处理要求定义某些对象宏,每个预定义宏的名称一两个下划线字符开头和结尾,这些预定义宏不能被取消定义(#undef)或由编程人员重新定义.下面预定义宏表,被我抄了下来. __LINE__ 当 ...
- 【部分原创】标准C语言的优先级、结合性、求值顺序、未定义行为和非确定行为浅析
零. 优先级 在C++ Primer一书中,对于运算符的优先级是这样描述的: Precedence specifies how the operands are grouped. It ...
- 标准SQL语言的用法
原文链接:http://www.ifyao.com/2015/05/18/%E6%A0%87%E5%87%86%E7%9A%84sql%E8%AF%AD%E8%A8%80%E4%BD%BF%E7%94 ...
- 关于标准C语言的预定义宏
标准C语言预处理要求定义某些对象宏,每个预定义宏的名称一两个下划线字符开头和结尾,这些预定义宏不能被取消定义(#undef)或由编程人员重新定义.下面预定义宏表,被我抄了下来.__LINE__ 当前 ...
- UML标准建模语言与应用实例
一.基本信息 标题:UML标准建模语言与应用实例 时间:2012 出版源:科技创新导报 领域分类:UML标准建模语言 面向对象 系统分析与设计 二.研究背景 问题定义:UML建模语言用图形来表现典型的 ...
- UML(统一建模语言)是通用的可视化标准建模语言。由构造块、公共机制、构架三部分组成。
UML UML(统一建模语言)是通用的可视化标准建模语言.由构造块.公共机制.构架三部分组成. 1.构造块:包括基本的UML建模元素(类.接口.用例等).关系(关联关系.依赖关系.泛化关系.实现关系) ...
- Python标准库笔记(11) — Operator模块
Operator--标准功能性操作符接口. 代码中使用迭代器时,有时必须要为一个简单表达式创建函数.有些情况这些函数可以用一个lambda函数实现,但是对于某些操作,根本没必要去写一个新的函数.因此o ...
- 标准C 语言总结
***************C语言****************** --day01-- Linux是一个和Windows类似的操作系统 通常通过终端软件使用Linux操作系统 终端软件里只能使用 ...
- 标准C语言(2)
字符类型名称是char,这个类型里一共包含256个不同的整数,每个整数代表一个字符(例如'a', '&'等),这些整数和字符可以互相替代,ASCII码表记录了所有整数和字符之间的对应关系 'a ...
随机推荐
- MATLAB灰色关联度分析
目录 1.释名 2.举例 3.操作步骤与原理详解 4.总结 5.附录:MATLAB代码 @ 1.释名 灰色关联度分析(Grey Relation Analysis,GRA),是一种多因素统计分析的方法 ...
- TensorFlow实战第八课(卷积神经网络CNN)
首先我们来简单的了解一下什么是卷积神经网路(Convolutional Neural Network) 卷积神经网络是近些年逐步兴起的一种人工神经网络结构, 因为利用卷积神经网络在图像和语音识别方面能 ...
- Markdown用法说明(用此篇博客做示例)
一份好的博客文档离不开一个优秀的编辑器.借此篇文章介绍一下编写该博客markdown的语法,后续再增加介绍其他语法,方便大家写出更好更漂亮的文档.点击左上角github,有主题源码哦 一份好的博客文档 ...
- spring data 返回任意字段
在spring boot + spring data查询数据库的过程中,有时候总会出现一些复杂的查询,我们希望数据库返回的字段能随意改变.这个需求在mybatis里很好解决,只需要用map接收就可以, ...
- ioctl接口内容操作
int ioctl( int fd, int request, .../* void *arg */ ) 详解 第三个参数总是一个指针,但指针的类型依赖于request 参数.我们可以把和网络相关的请 ...
- 【转贴】Debian 10 "buster" 正式发布
Debian 10 "buster" 正式发布 https://news.cnblogs.com/n/627909/ 我看到龙芯的 就是 mips64el 的指令集.. Linux ...
- 什么是云数据库RDS PostgreSQL 版
PostgreSQL被业界誉为“最先进的开源数据库”,面向企业复杂SQL处理的OLTP在线事务处理场景,支持NoSQL数据类型(JSON/XML/hstore).支持GIS地理信息处理. 优点 NoS ...
- 使用mvn archetype:generate快速建立Maven项目目录结构
1.mvn archetype:generate 按照提示进行选择,默认选的话可以直接按回车键 2.mvn archetype:generate -DgroupId=组织名,公司网址的反写+项目名 ...
- SpringBoot项目打成Jar包时运行
使用java -jar ***.jar执行jar包的时候,会找jar包中的main()方法. 对于SpringBoot项目的Jar包,在META-INF目录下的MANIFEST.MF文件中,Main- ...
- 如何将本地的项目推送至git仓库
转载:https://www.jianshu.com/p/31dea20b0084 1.cd projectName probjectName是项目文件夹的名字, 先进入项目文件夹 2.git ini ...