C/C++一些重要的关键字

一、static关键字
1、修饰局部变量–静态局部变量
特点:

1.1、static修饰局部变量,会影响局部变量的生命周期,本质改变了局部变量的储存位置,生命周期变长,为整个周期,其作用域还是局部,静态局部变量存储于进程中的全局数据区。
1.2、静态局部变量(c)是在编译时赋初值的,即只赋初值一次,在程序运行时它已有初值。以后每次调用函数时不再重新赋初值而只是保留上次函数调用结束时的值。
1.3、如果在定义局部变量时不给它赋初值,那么对静态局部变量来说,编译时自动赋初值0(对数值型变量),或者空字符’\0’(对字符变量)。而对自动变量来说,其值是个不确定的值。

2、修饰全局变量–静态全局变量
特点:

全局变量本身具有外部链接属性,即全局变量的作用域是整个工程,但是如果用 static 修饰全局变量,就会使得全局变量失去外部链接属性,变成内部链接属性,即只能在自己的文件中使用,所以 static 修饰的全局变量时,只能在自己的 .c 文件中使用。

3、修饰函数
特点:

函数默认是有外部链接属性的,但是被 static 修饰后,会使得函数失去外部链接属性,变成内部链接属性。所以 static 修饰的函数只能在自己所在的 .c 文件内部使用,不能在其他文件中使用。和 static 修饰全局变量 很像。

总结
1、static修饰变量

a. 修饰函数中局部变量:

 声明周期延长:该变量不随函数结束而结束初始化:只在第一次调用该函数时进行初始化记忆性:后序调用时,该变量使用前一次函数调用完成之后保存的值存储位置:不会存储在栈上,放在数据段

b. 修饰全局变量
改变该变量的链接属性,让该变量具有文件作用域,即只能在当前文件中使用
c. 修饰变量时,没有被初始化时会被自动初始化为0

2、static修饰函数

改变该函数的链接属性,让该函数具有文件作用域,即只能在当前文件中使用

二、const关键字
a、修饰局部变量
const int n=5;
int const n=5;
作用:修饰变量使得变量n的值不能被改变

这两种写法是一样的,都是表示变量n的值不能被改变了,需要注意的是,用const修饰变量时,一定要给变量初始化,否则之后就不能再进行赋值了。

b、修饰常量静态字符串
eg:const char* str="fdsafdsa";

如果没有const的修饰,我们可能会在后面有意无意的写str[4]=’x’这样的语句,这样会导致对只读内存区域的赋值,然后程序会立刻异常终止。有了const,这个错误就能在程序被编译的时候就立即检查出来,这就是const的好处。让逻辑错误在编译期被发现。

c、常量指针与指针常量
常量指针是指针指向的内容是常量,可以有一下两种定义方式
const int * n;
int const * n;注意事项:
1、常量指针说的是不能通过这个指针改变变量的值,但是还是可以通过其他的引用来改变变量的值的。
int a=5;
const int* n=&a;
a=6;2、常量指针指向的值不能改变,但是这并不是意味着指针本身不能改变,常量指针可以指向其他的地址。
int a=5;
int b=6;
const int* n=&a;
n=&b;指针常量是指指针本身是个常量,不能在指向其他的地址,写法如下:
int *const n;
注意事项:
指针常量指向的地址不能改变,但是地址中保存的数值是可以改变的,可以通过其他指向改地址的指针来修改。
int a=5;
int *p=&a;
int* const n=&a;
*p=8;区分常量指针和指针常量的关键就在于星号的位置,我们以星号为分界线,如果const在星号的左边,则为常量指针,如果const在星号的右边则为指针常量。如果我们将星号读作‘指针’,将const读作‘常量’的话,内容正好符合。int const * n;是常量指针,int *const n;是指针常量。指向常量的常指针-》是以上两种的结合,指针指向的位置不能改变并且也不能通过这个指针改变变量的值,但是依然可以通过其他的普通指针改变变量的值。
const int* const p;
d、修饰函数的参数
根据常量指针与指针常量,const修饰函数的参数也是分为三种情况1、防止修改指针指向的内容void StringCopy(char *strDestination, const char *strSource);
其中 strSource 是输入参数,strDestination 是输出参数。给 strSource 加上 const 修饰后,如果函数体内的语句试图改动 strSource 的内容,编译器将指出错误。2、防止修改指针指向的地址
void swap ( int * const p1 , int * const p2 )
指针p1和指针p2指向的地址都不能修改。3、以上两种的结合。
void test(int * const p1 ,const char *strSource);
e、修饰函数的返回值
如果给以“指针传递”方式的函数返回值加 const 修饰,那么函数返回值(即指针)的内容不能被修改,该返回值只能被赋给加const 修饰的同类型指针。
例如函数const char * GetString(void);如下语句将出现编译错误:char *str = GetString();正确的用法是const char *str = GetString();
f、修饰全局变量

全局变量的作用域是整个文件,我们应该尽量避免使用全局变量,因为一旦有一个函数改变了全局变量的值,它也会影响到其他引用这个变量的函数,导致除了bug后很难发现,如果一定要用全局变量,我们应该尽量的使用const修饰符进行修饰,这样防止不必要的人为修改,使用的方法与局部变量是相同的。

三、typeof关键字

typeof 是 GNU C 扩展的一个关键字,用来获取一个变量或表达式的类型
typedef是在C和C++编程语言中的一个关键字。作用是为现有的数据类型(int、float、char……)创建一个新的名字,目的是为了使代码方便阅读和理解。
eg:

typedef struct {  int x;  int y;  
} Point; typedef int Integer;  
typedef float FloatNumber;  Integer a = 10;  
FloatNumber b = 3.14;

使用typeof的声明限制:
1、请注意,typeof构造中的类型名不能包含存储类说明符,如extern或static。不过允许包含类型限定符,如const或volatile。

例如,下列代码是无效的,因为它在typeof构造中声明了extern:
typeof(extern int) a;

2、下列代码使用外部链接来声明标识符b是有效的,表示一个int类型的对象。下一个声明也是有效的,它声明了一个使用const限定符的char类型指针,表示指针p不能被修改。
extern typeof(int) b;
typeof(char * const) p = “a”;

3、在宏声明中使用typeof
typeof构造的主要应用是用在宏定义中。可以使用typeof关键字来引用宏参数的类型。因此,在没有将类型名明确指定为宏实参的情况下,构造带有所需类型的对象是可能的。
下面是一个交换两个变量的值的宏定义:

#define swap(a, b) \

do {
typeof(a) __tmp = (a);
(a) = (b);
(b) = __tmp;
} while (0)
这个宏可以交换所有基本数据类型的变量(整数,字符,结构等)

四、inline关键字

内联函数的定义:

inline int Add(int a, int b) {  return a + b;  
}

作用:减少函数调用的开销,假如我们的程序中有一个函数会频繁的被调用,这样使程序的运行速度十分缓慢,那么我们使用内联函数,就可以解决这种问题,提高程序的运行效率.

需要注意的是,过度使用inline关键字可能导致可执行文件的体积增大。因此,在决定是否使用inline时,需要权衡代码执行效率和程序体积之间的关系。

五、extern关键字

extern 告诉编译器这个变量或函数在当前文件中是可见的,但它的实际定义(即存储分配)是在其他地方完成的。
eg:
假设你有两个源文件 file1.c 和 file2.c,以及一个头文件 shared.h。

1、修饰变量
shared.h
// 在头文件中声明一个extern变量  
extern int shared_variable;
file1.c
#include "shared.h"  // 定义变量  
int shared_variable = 10;  void functionInFile1() {  // 使用变量  printf("Value of shared_variable in file1: %d\n", shared_variable);  
}
file2.c
#include <stdio.h>  
#include "shared.h"  void functionInFile2() {  // 使用变量  printf("Value of shared_variable in file2: %d\n", shared_variable);  
}
2、修饰函数
shared.h
// 在头文件中声明一个extern函数  
extern void shared_function();file1.c
#include <stdio.h>  
#include "shared.h"  void shared_function() {  printf("This is a shared function.\n");  
}file2.c
#include "shared.h"  void functionInFile2() {  // 调用在其他文件中定义的函数  shared_function();  
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/764017.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

6 修改主机名和HOSTS文件

后期我们会配置多台服务器&#xff0c;那么每台服务器我们都会给定一个主机名&#xff0c;方便后期通过主机名进行访问。主机名的修改我们可以在安装操作系统时对其修改&#xff0c;如果忘记了&#xff0c;就可以修改配置文件完成&#xff0c;像后期我们进行虚拟机克隆后&#…

(一)基于IDEA的JAVA基础5

Scanner的使用 使用scanner可以接收键盘上输入的数据&#xff0c; Scanner inputnew Scanner(System.in)&#xff1b; 导包的方式: 什么是导包&#xff0c;导入的是jdk提供的java开发工具包&#xff0c;我们建一个java文件&#xff0c;psvm快捷输入后&#xff0c;打上new S…

海边游艇港口迈入智能新纪元:数字孪生系统引领未来趋势

在浩瀚的海洋边&#xff0c;游艇港口不仅是停泊游艇的港湾&#xff0c;更是展现城市风貌与智慧科技的窗口。如今&#xff0c;随着数字化技术的飞速发展&#xff0c;海边游艇港口也迎来了前所未有的变革——数字孪生系统的应用&#xff0c;正悄然改变着传统游艇港口的运营模式&a…

C语言例3-33:从键盘输入一个正整数保存至int 型变量 num,输出由8~11构成的数(从低位、0号开始编号)

算法分析&#xff1a; 使变量num右移8位&#xff0c;将原来的8~11位移到低4位上构造一个低4位为1&#xff0c;其余位为0的整数&#xff08;0000 0000 0000 1111&#xff09;与变量num进行按位与运算 代码如下&#xff1a; #include<stdio.h> int main(void) {int num,…

js实现读取excel文件

1、引入js文件&#xff0c;如下 <script src"https://code.jquery.com/jquery-2.2.4.js"></script> <script src"https://cdn.bootcss.com/xlsx/0.15.1/xlsx.core.min.js"></script> 2、判断文件是否是excel文件 var url$(#exc…

复试专业前沿问题问答合集9——密码学

复试专业前沿问题问答合集9——密码学 网络安全中的密码学加密算法原理及基础知识问答: Q1: 对称加密算法是如何工作的? A1: 对称加密算法使用相同的密钥进行数据的加密和解密。这种加密方式的关键在于密钥的保密,因为任何拥有密钥的人都可以解密信息。对称加密算法速度快…

24计算机考研调剂 | 西北民族大学

西北民大数计学院【核医学数字图像工程】专业招收2名学术硕士调剂生 考研调剂招生信息 一、招生专业 工学->计算机科学与技术 二、调剂要求 1&#xff09;不限制本科出身&#xff0c;但要求一志愿报考985/211、双一流院校的计算机科学与技术及相关专业&#xff08;学硕&a…

【最后2天】京东云游戏云服务器0门槛抽奖送!云服务器选购推荐 京东云 阿里云 腾讯云对比 幻兽帕鲁 雾锁王国 省钱学生党

好消息&#xff1a;抽奖活动开启&#xff01;时间&#xff1a;3月17日——3月24日 最高奖品&#xff1a;16G 6个月&#xff1b;32G 3个月 抽奖规则&#xff1a;B站点赞评论关注即可参与抽奖&#xff0c;3.24日公布获奖名单。 抽奖地址&#xff1a; 【首次抽奖】16G、32G免费…

docker的部署与安装以及部署一个docker(容器)应用及docker容器常出现的问题

docker 架构图 一、docker的部署与安装 1、在 CentOS 上安装 Docker 移除旧版本&#xff08;如果有的话&#xff09;&#xff1a;sudo yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-…

大模型时代,5个最顶级的向量数据库

介绍5个向量数据库。 大模型时代&#xff0c;向量数据库彻底的火了&#xff0c;今天我分享业内最频繁使用的向量数据库&#xff0c;更多实践经验&#xff0c;可以文末参加我们的技术落地的讨论&#xff0c;喜欢本文记得收藏、关注、点赞。 1 Chroma 使用ChromaDB构建LLM应用程…

C++ QT串口通信(3)-监听串口拔插(windows)

本文讲解Qt中的监听串口拔插适用于windows系统。 概述 监听串口的插入和拔出,需要使用QAbstractNativeEventFilter类,主要作用是捕获全局系统消息。 使用QSerialPortInfo类获得串口列表。 首先创建串口监听的类 #ifndef SERIALCHANGE_H #define SERIALCHANGE_H#include …

信雅纳400/800G网络测试仪之 CDF/ Extended Payload 功能:完全用户自定义的协议报文支持/可编程的协议内容支持

Note# 2024-3-21 今天被一个做芯片测试的客户追着问&#xff0c;应该合作在测试仪上做完全自定义的报文&#xff0c;添加自己的私有协议进去&#xff0c;他觉得每次都导入报头太麻烦了&#xff0c;然后就看了下Application Note关于CDF功能的描述&#xff0c;照着机翻的版本来…

DashScope - 阿里模型服务灵积

文章目录 关于 DashScope快速上手代码调用http 请求示例Python 调用 关于 DashScope 官方主页&#xff1a;https://dashscope.aliyun.comPYPI : https://pypi.org/project/dashscope/支持模型&#xff1a;https://dashscope.console.aliyun.com/model DashScope灵积模型服务建…

力扣hot100题解(python版96-100题)

96、只出现一次的数字 给你一个 非空 整数数组 nums &#xff0c;除了某个元素只出现一次以外&#xff0c;其余每个元素均出现两次。找出那个只出现了一次的元素。 你必须设计并实现线性时间复杂度的算法来解决此问题&#xff0c;且该算法只使用常量额外空间。 示例 1 &…

Spring学习记录之面向切面编程

AOP&#xff08;面向切面编程&#xff09;是一种编程思想&#xff0c;其作用在于在不改变其原始设计的基础上进行功能增强。这也是Spring的开发理念&#xff1a;无侵入式编程。其实&#xff0c;这是一种代理思想&#xff0c;事实上&#xff0c;SpringAOP是动态代理的一种形式。…

一站式App流量统计,Xinstall助您洞悉用户行为

在如今的移动互联网时代&#xff0c;App的推广和运营对于开发者来说至关重要。然而&#xff0c;想要精准掌握App的流量情况&#xff0c;却并不是一件容易的事情。这时&#xff0c;一款强大的App流量统计工具就显得尤为重要。而Xinstall&#xff0c;正是这样一款能够帮助开发者轻…

优惠:阿里云4核16G服务器优惠价格26.52元1个月、149.00元半年

阿里云4核16G服务器优惠价格26.52元1个月、79.56元3个月、149.00元半年&#xff0c;配置为阿里云服务器ECS经济型e实例ecs.e-c1m4.xlarge&#xff0c;4核16G、按固定带宽 10Mbs、100GB ESSD Entry系统盘&#xff0c;活动链接 aliyunfuwuqi.com/go/aliyun 活动链接打开如下图&a…

项目实战-开发工具入门/基本框架搭建/项目初始化/引入组件库

上周更新完了之前vue3的shopping项目&#xff0c;接下来&#xff0c;将会开启一个新的项目&#xff0c;效果是类似于移动端的一个伙伴匹配项目&#xff0c;今天这篇文章从需求分析到架构设计再到项目初始化&#xff0c;基本框架搭建几个部分来为大家详细介绍。 从这个项目开始…

流程引擎表单引擎有哪几个方面的优势?

想要在信息科技迅猛发展的时代中&#xff0c;拥有强劲的市场竞争力&#xff0c;随时捕捉市场发展动态&#xff0c;获得长久发展&#xff0c;就需要正确掌握优质的发展技术平台&#xff0c;为企业可持续发展注入新鲜动力。低代码技术平台、流程引擎表单引擎的兴盛发展是推动各中…

UI功能6大流程、接口测试8大流程这些你真的全会了吗?

在讲接口流程测试之前&#xff0c;首先需要给大家申明下&#xff1a;接口测试对于测试人员而言&#xff0c;非常非常重要&#xff0c;懂功能测试接口测试&#xff0c;就能在企业中拿到一份非常不错的薪资。 这么重要的接口测试&#xff0c;一般也是面试笔试必问。为方便大家更…