【C语言】C语言其他

发布于:2023-01-04 ⋅ 阅读:(217) ⋅ 点赞:(0)


前言

本届课讲的是一些其他没讲到的知识点


提示:以下是本篇文章正文内容,下面案例可供参考

一、多文件、<>与""的区别、防止头文件重复包含

多文件

多文件:就是有多个源文件的编程, 函数的作用:将一大堆代码按照功能封装成多个函数,方便维护管理 文件的作用:将一大堆函数按照功能分别写在多个文件中,方便维护管理 多文件的本质跟单文件是一样的,比如想要使用使用一个函数,不管在不在同一个文件中, 都需要声明,声明一下就能使用别的文件里内容了。简单演示: 如果要使用的函数比较多,那么每个使用的文件内的最前都要写上相同的声明,写很多次, 非常不方便,所以就出来了头文件,头文件内写着所有需要的声明,那个文件需要,就直接 包含该头文件即可,#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常变量

本文含有隐藏内容,请 开通VIP 后查看