文章目录
前言
本届课讲的是一些其他没讲到的知识点
提示:以下是本篇文章正文内容,下面案例可供参考
一、多文件、<>与""的区别、防止头文件重复包含
多文件
多文件:就是有多个源文件的编程, 函数的作用:将一大堆代码按照功能封装成多个函数,方便维护管理 文件的作用:将一大堆函数按照功能分别写在多个文件中,方便维护管理 多文件的本质跟单文件是一样的,比如想要使用使用一个函数,不管在不在同一个文件中, 都需要声明,声明一下就能使用别的文件里内容了。简单演示: 如果要使用的函数比较多,那么每个使用的文件内的最前都要写上相同的声明,写很多次, 非常不方便,所以就出来了头文件,头文件内写着所有需要的声明,那个文件需要,就直接 包含该头文件即可,#include <stdio.h>,这样就省时省力了。 既然包含头文件可以代替直接写声明,所以包含头文件本身就是声明了其内所有声明。 推断出:#include <stdio.h>的作用就是单纯的复制黏贴。实际也是这样。
创建多文件(vs2022):
右键解决方案下面的项目名称->添加->添加源文件/头文件
<>与""的区别
1、标准库头文件使用尖括号,自定义头文件使用双引号
2、查找起始路径不一样: 工程所在相对路径:vcxproj 包含默认查找路径:项目属性 -> vc++目录 -> 包含目录 双引号先在工程文件所在路径查找,然后在包含的默认路径依次查找,直到找到它 尖括号直接在包含的默认路径依次查找,直到找到它 直接写头文件的绝对路径是编译效率最高的。
防止头文件重复包含
#pragma once 新版条件编译
旧版条件编译
ifndef _AN
函数,变量…声明
define _AN
写在文件最开始
二、宏define、存储类typedef
宏define
宏的意义:单纯的替换,不进行任何运算等
常量宏#define N 10
为什么说宏不进行计算?看下
#define YY 3+2
YY;//不是先算3+2 而是把3+2替换到YY的位置,YY去除,再进行运算
参数宏及其使用:
在宏后面添加(参数)
注意:宏的参数不需要类型
//参数宏
#define D(x,y) x+y
#define DD(x) x+x
//使用
D(10, 18);
DD(12);
typedef存储类
typedef的意义:typedef 类型重命名,给类型名起个新的名字
一些示例
typedef int myint;
//myint a = 34;
typedef int* pint; //pint p = &a;
typedef int** ppint; //ppint pp = &p;
typedef int arr[5] ; //arr b = {1,2,3,4,5};
typedef int(*parr)[5]; //parr pa = &a;
typedef int(*pfun)(int ,double); //pfun pf = fun;
typedef struct Node node; //node a = {"小明", 56.5};
typedef struct Node* pnode; //pnode pn = &a; typedef struct Node
{
char str[20];
double b;
}node;
//node a = {"小明", 56.5};
typedef struct //无名 { char str[20]; double b; }NODE;
前面为系统类型,后面为自定义的其他名字
大家可以参照上面把系统类型改成其他自定义的名字去使用
还可以把自己定义的类型再typedef一次
三、全局变量extern、静态全局变量static、局部变量auto
全局变量extern
全局变量:定义在全局位置的变量,作用域是整个工程,生命周期与程序共存亡 只能定义在源文件中,不能重复定义,所有文件都可用。
默认初始化成 0 在其他源文件使用,先声明:extern int a; 不能初始化 叫声明外部变量 extern 全局变量与局部变量重名,在局部区域内,局部变量起效。
实际应用中不要重名。
静态全局变量static
static 静态全局变量: 在全局变量前加个 static,作用域是所在文件,生命周期与程序共存亡 如果想要这个变量只在某个源文件中使用,其他文件不可用,那么就声明成静态全局变量
static int a = 12; //默认初始化成 0
static 静态局部变量:默认初始化 0 在局部变量前加上 static,作用域是所在大括号,生命周期与程序共存亡 相当于全局静态变量,其作用域仅是所在大括号。
{
static int a = 18;
//此时a释放内存}
在大括号之前,这个源文件是全局可用的
静态函数
static void fun(void)
{
static int a = 2;//不是每次都重新定义变量 a,而是一直都存在
a++;
printf("%d ", a);
}
fun();//a == 3;
fun();//a == 4;
fun();//a == 5;
注意:静态函数只能使用静态变量
局部变量auto、寄存器变量register、常量const
局部变量auto
局部变量是什么:在某个大括号内定义的变量,叫局部变量。作用域是所在大括号,生命周期是所在大括号
auto 关键字,局部变量前默认有 auto 关键字,可省略,auto 是自动的意思,局部变量也 叫自动变量,自动就是空间自动申请自动释放,完全操作系统管理
在 vc++2010 中,auto 有自动识别类型的功能: auto a = 12; //int auto b = 23.4;//double auto c = 4.5f; //float
auto a = 18;
register寄存器变量
寄存器不是物理内存,它是集成在 cpu 上的一块存储区域,所以不能取地址。
register int a = 23;
&a; //直接报错
实际上,寄存器空间非常珍贵有限,所以 a 是否在寄存器上,取决于操作系统的算法调度, 一般都是不行。
const常量
const 常量修饰符
使用:
const a = 18;
注意:const变量必须初始化,const变量不能改值,只能增,删,查
const int a = 23; //报错 a=45;
const int b[5] = {1,2}; //报错 b[2] = 4;
int a = 12, b=56 ;
const int* p = &a; //报错 *p = 23; p = &b;不报错
int* const p = &a; //不报错 *p = 23; p = &b;报错 const int* const p = &a; //报错 *p = 23; p = &b;报错
四、随机数srand、rand
srand种种子
每一个随机数都需要大量算法去给他做一个假打乱,打乱开始必须要有一个值,这个值就是种子
为了每次都随机,我们的种子一般是现在的时间戳:time(NULL)
srand(int r)
rand随机数
当我们种下种子后,我们调用rand就会生产一个随机数
int n = rand();
随机数其他知识
取0~10怎么办rand()%11;
取1~11怎么办rand()%12+1
其他的范围也可以这样取
总结
本节课讲了多文件、<>与""的区别、防止头文件重复包含、宏(#define)、typedef、全局变量extern、static静态变量、static静态函数、auto局部变量、register寄存器、const常变量