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

/*
* 多文件编程演示
* */
#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. koa-session 持久化

    一.使用mongoose链接数据库 'use strict'; const mongoose = require('mongoose'); const config = require('config ...

  2. Python聚类算法之基本K均值实例详解

    Python聚类算法之基本K均值实例详解 本文实例讲述了Python聚类算法之基本K均值运算技巧.分享给大家供大家参考,具体如下: 基本K均值 :选择 K 个初始质心,其中 K 是用户指定的参数,即所 ...

  3. golang 多级json转map

    func main() { jsonStr := `{"isSchemaConforming":true,"schemaVersion":0,"unk ...

  4. Mybatis操作数据时出现:java.sql.SQLSyntaxErrorException: Unknown column 'XXX' in 'field list'

    这个错误比较重要,而且很常见,故单独进行说明: Mybatis出现:Unknown column 'xxx' in 'field list' 先来看一下程序的内部: dao.addUser(" ...

  5. php composer 开发自己的包

    以往都是在项目直接写自己的包文件,并没有把他放在packagist上面,以composer来管理使用. 今天没事来整一下,供大家一起学习 一,在github和packagist分别注册自己的账号,这里 ...

  6. caoz的梦呓:信息安全,别为了芝麻丢了西瓜

    猫宁!!! 参考链接:https://mp.weixin.qq.com/s/z6UI-tdhN1CGdqQQuglLVQ 对方公众号:caoz的梦呓 我之前写微博的时候,经常就有读者反馈说,你怎么用3 ...

  7. 【CUDA开发】Thrust库

    Thrust库从C++的STL中得到灵感,将最简单的类似于STL的结构放在Thrust库中,比如STL中的vector.此外,Thrust库还包含STL中的算法和迭代器.        Thrust函 ...

  8. 关于moment().format()

    链接在这儿http://momentjs.cn/ 想要获取单独的年份或者月份可以使用:   moment().format('YYYY')和moment().format('MM') 随手记一下...

  9. git 添加第二个远程仓库地址,一次修改到处上传~

    上传本机git 公钥到对应的代码托管平台 github/码云等 本地仓库执行 git remote set-url --add origin https://gitee.com/qichengTech ...

  10. Oracle 获取当前日期是月的第几周

    函数FUNC_GET_WEEKOFMONTH: IW 是年的自然周: WW是年的第一天起开始算7天为一周 FUNCTION FUNC_GET_WEEKOFMONTH (V_PSD DATE) RETU ...