多文件编程时一个文件里可以包含多个函数,一个函数只能属于一个文件

/*
* 多文件编程演示
* */
#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)的更多相关文章

  1. 关于标准C语言的预定义宏【转】

    标准C语言预处理要求定义某些对象宏,每个预定义宏的名称一两个下划线字符开头和结尾,这些预定义宏不能被取消定义(#undef)或由编程人员重新定义.下面预定义宏表,被我抄了下来. __LINE__  当 ...

  2. 【部分原创】标准C语言的优先级、结合性、求值顺序、未定义行为和非确定行为浅析

    零. 优先级    在C++ Primer一书中,对于运算符的优先级是这样描述的:     Precedence specifies how the operands are grouped. It ...

  3. 标准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 ...

  4. 关于标准C语言的预定义宏

    标准C语言预处理要求定义某些对象宏,每个预定义宏的名称一两个下划线字符开头和结尾,这些预定义宏不能被取消定义(#undef)或由编程人员重新定义.下面预定义宏表,被我抄了下来.__LINE__  当前 ...

  5. UML标准建模语言与应用实例

    一.基本信息 标题:UML标准建模语言与应用实例 时间:2012 出版源:科技创新导报 领域分类:UML标准建模语言 面向对象 系统分析与设计 二.研究背景 问题定义:UML建模语言用图形来表现典型的 ...

  6. UML(统一建模语言)是通用的可视化标准建模语言。由构造块、公共机制、构架三部分组成。

    UML UML(统一建模语言)是通用的可视化标准建模语言.由构造块.公共机制.构架三部分组成. 1.构造块:包括基本的UML建模元素(类.接口.用例等).关系(关联关系.依赖关系.泛化关系.实现关系) ...

  7. Python标准库笔记(11) — Operator模块

    Operator--标准功能性操作符接口. 代码中使用迭代器时,有时必须要为一个简单表达式创建函数.有些情况这些函数可以用一个lambda函数实现,但是对于某些操作,根本没必要去写一个新的函数.因此o ...

  8. 标准C 语言总结

    ***************C语言****************** --day01-- Linux是一个和Windows类似的操作系统 通常通过终端软件使用Linux操作系统 终端软件里只能使用 ...

  9. 标准C语言(2)

    字符类型名称是char,这个类型里一共包含256个不同的整数,每个整数代表一个字符(例如'a', '&'等),这些整数和字符可以互相替代,ASCII码表记录了所有整数和字符之间的对应关系 'a ...

随机推荐

  1. Linux 查看操作系统版本信息 uname

    Linux 查看操作系统版本信息 uname uname 命令用于显示当前系统的版本信息. 带 -a 选项的 uname 命令会给出当前操作系统的所有有用信息. 命令如下: [root@node1 / ...

  2. 【转】Apache HBase 问题排查思路

    [From]https://www.itcodemonkey.com/article/9426.html HBCK - HBCK检查什么? (1)HBase Region一致性 集群中所有region ...

  3. spring-boot集成3:集成swagger

    Why swagger? 使用swagger让你从编写接口文档的无聊工作中解脱出来 1.Maven依赖 <!-- swagger --> <dependency> <gr ...

  4. PHP $_SERVER超全局变量

    $_SERVER是php中的超全局变量,一个包含了诸如头信息(header).路径(path).以及脚本位置(script locations)等等信息的数组.这个数组中的项目由 Web 服务器创建. ...

  5. Beego框架的一条神秘日志引发的思考

    公司目前的后台是用Beego框架搭的,并且为了服务的不中断升级,我们开启了Beego的Grace模块,用于热升级支持.一切都跑井然有序,直到有一天,领导甩出一些服务日志,告知程序一直报错: 2018/ ...

  6. Redis客户端信息的存取

    字符串的存: set name xxx 字符串的取: get name Hashes的存: HMSET xxx xxx xxx Hashes的取: HGETALL xxx Lists的存: lpush ...

  7. Vue中的slot

    个人理解:是对组件的扩展,通过slot插槽向组件内部指定位置传递内容,通过slot可以父子传参: Slot的通俗理解 是“占坑”,在组件模板中占好了位置,当使用该组件标签时候,组件标签里面的内容就会自 ...

  8. MVC模型简介

    MVC模型:是一种架构型的模式,本身不引入新功能,只是帮助我们将开发的结构组织的更加合理,使展示与模型分离.流程控制逻辑.业务逻辑调用与展示逻辑分离. 首先让我们了解下MVC(Model-View-C ...

  9. ServletContainerInitializer

    在web容器启动时为提供给第三方组件机会做一些初始化的工作,例如注册servlet或者filtes等,servlet规范中通过ServletContainerInitializer实现此功能. 每个框 ...

  10. Linux C/C++基础——二级指针做形参

    1.二级指针做形参 #include<stdio.h> #include<stdlib.h> void fun(int **temp) { *temp=(int*)malloc ...