网站开发 售后服务协议/免费软文发布平台有哪些
一、关键字static、const、extern、volatile作用
1、const
1.修饰常量
用const修饰的变量是不可变的,修饰后的变量只能使用,不能修改。
2.修饰指针
如果const位于*的左侧,eg:const int* a,则const就是用来修饰指针所指向的变量,此时为常量指针,即指针指向*a为常量;
如果const位于*的右侧,eg:int* const a,const就是修饰指针本身,此时为指针常量,即指针本身a是常量。
const int* p = &a; // 常量指针;指针指向的内容不能变,*p不能变
int* const p = &a; // 指针常量;指针本身不能变, p不能变
3.修饰函数参数
用const修饰函数参数,传递过来的参数在函数内不可以改变。
void func (const int &n)
{n = 10; // 编译错误
}
2、static (静:是一种约束,不能乱跑,乱动)
1.修饰变量
(1)修饰局部变量
局部变量没有被static修饰: 存储在栈中 自动初始值不固定
局部变量被static修饰: (叫做局部静态变量)存储在全局数据区 初始化为0
代码运行,分析:
子函数变量中不加static进行修饰
#include <stdio.h>void test()
{static int a = 0;a++;printf("%d ", a);
}
int main()
{int i = 0;for (i = 0; i < 8; i++){test();}return 0;
}
子函数中加static进行修饰
#include <stdio.h>void test()
{static int a = 0;a++;printf("%d ", a);
}
int main()
{int i = 0;for (i = 0; i < 8; i++){test();}return 0;
}
(2)修饰全局变量
全局变量定义在函数体外部,在全局数据区分配存储空间,且编译器会自动对其初始化。
全局变量没有被static修饰: 整工程所有文件可以用这个全局变量(其它文件使用时候需要extern外部声明)也就是说其他文件不能再定义一个与其相同名字的变量了(否则编译器会认为它们是同一个变量)。
全局变量被static修饰:静态全局变量仅对当前文件可见,其他文件不可访问,其他文件可以定义与其同名的变量,两者互不影响。
static定义全局变量的作用:在定义不需要与其他文件共享的全局变量时,加上static关键字能够有效地降低程序模块之间的耦合,避免不同文件同名变量的冲突,且不会误使用。
2.修饰函数
在函数的返回类型前加上static,就是静态函数。
静态函数:只能在声明它的文件中可见,其他文件不能引用该函数,不同的文件可以使用相同名字的静态函数,互不影响。
非静态函数:可以在另一个文件中直接引用,甚至不必使用extern声明。
3.C++面向对象中static用法
(1)类内静态数据成员
作用:实现多个对象共享数据的目标。
static 成员变量属于类,不属于某个具体的对象,即使创建多个对象,也只为 m_total (下面程序中)分配一份内存,所有对象使用的都是这份内存中的数据。当某个对象修改了 m_total,也会影响到其他对象。
class Student{
public:Student(char *name, int age, float score);void show();
public:static int m_total; //静态成员变量
private:char *m_name;int m_age;float m_score;
};
(2)使用方法
初始化静态成员变量:
static 成员变量的内存既不是在声明类时分配,也不是在创建对象时分配,而是在(类外)初始化时分配。反过来说,没有在类外初始化的 static 成员变量不能使用。
int Student::m_total = 0;
静态成员变量访问:
static 成员变量既可以通过对象来访问,static 成员变量不占用对象的内存,而是在所有对象之外开辟内存,即使不创建对象也可以访问。具体来说,static 成员变量和普通的 static 变量类似,都在内存分区中的全局数据区分配内存。
//通过类类访问 static 成员变量
Student::m_total = 10;
//通过对象来访问 static 成员变量
Student stu("小明", 15, 92.5f);
stu.m_total = 20;
//通过对象指针来访问 static 成员变量
Student *pstu = new Student("李华", 16, 96);
pstu -> m_total = 20;
3、extern
1.修饰变量
若一个变量需要在同一个工程中不同文件里直接使用或修改,则需要将变量做extern声明。只需将该变量在其中一个文件中定义,然后在另外一个文件中使用extern声明便可使用,但两个变量类型需一致。
方式一:
在1.c中定义全局变量
int i; 在2.c和3.c中都用
extern int i;声明一下就可以使用了
方式 二:
在头文件a.h 中声明
extern int i; 在其他某个c文件中定义
int i =0; 其他要使用i变量的c源文件只需要include"a.h"就可以
2.修饰函数
在定义函数时,如果在函数首部的最左端冠以关键字extern,则表示此函数是外部函数,可以供其他文件调用。C语言规定,如果在定义函数时省略extern,则隐含为外部函数。在文件中要调用其他文件中的外部函数,则需要在文件中用extern声明该外部函数,然后就可以使用。
和定义全局变量 方式二比较相同呢。
4、volatile
1.修饰变量
编译器对访问该变量的代码就不再进行优化,从而可以提供对特殊地址的稳定访问,这点在单片机这种存储器有限制的程序中需要注意。
声明时语法:
int volatile vInt;
volatile int i=10;
int a = i;
...
// 其他代码,并未明确告诉编译器,对 i 进行过操作
int b = i;
当要求使用 volatile 声明的变量的值的时候,系统总是重新从它所在的内存读取数据,即使它前面的指令刚刚从该处读取过数据。而且读取的数据立刻被保存。
volatile 指出 i 是随时可能发生变化的,每次使用它的时候必须从 i的地址中读取,因而编译器生成的汇编代码会重新从i的地址读取数据放在 b 中。而优化做法是,由于编译器发现两次从 i读数据的代码之间的代码没有对 i 进行过操作,它会自动把上次读的数据放在 b 中。而不是重新从 i 里面读。这样以来,如果 i是一个寄存器变量或者表示一个端口数据就容易出错(可能某些寄存器值,被中断程序改变),所以说 volatile 可以保证对特殊地址的稳定访问。
参考文章:
c语言中static关键字用法详解_static在c语言中的用法_guotianqing的博客-CSDN博客
C++ static静态成员变量详解 (biancheng.net)
二、内存分配&堆和栈
1、堆和栈
1.栈(stack=stand)
我叫它客栈,人来人往,只是大家伙(变量)临时休息的地方。
2.堆(heap)
2、内存分配
1、一个C/C++编译的程序占用内存分为以下5个部分
栈区(stack):由编译器自动分配与释放,存放为运行时函数分配的局部变量、函数参数、返回数据、返回地址等。其操作类似于数据结构中的栈。
堆区(heap):一般由程序员自动分配,如果程序员没有释放,程序结束时可能有OS回收。其分配类似于链表。
全局区(静态区static):存放全局变量、静态数据、常量。程序结束后由系统释放。全局区分为已初始化全局区(data)和未初始化全局区(bss)。
代码区:存放函数体(类成员函数和全局区)的二进制代码。
常量区(文字常量区):存放常量字符串,程序结束后有系统释放。
参考文章:
C/C++程序内存的分配_c++内存分配_cherrydreamsover的博客-CSDN博客
C语言:内存分配 - 知乎 (zhihu.com)
C语言的内存分配{静态内存&动态内存&堆栈}_c语言内存_梅尔文的博客-CSDN博客
相关文章:

C/C++面试总结
一、关键字static、const、extern、volatile作用 1、const 1.修饰常量 用const修饰的变量是不可变的,修饰后的变量只能使用,不能修改。 2.修饰指针 如果const位于*的左侧,eg:const int* a,则const就是用来修饰指针…...

Python爬虫的Selenium(学习于b站尚硅谷)
目录 一、Selenium 1.为什么要学习Selenium (1)什么是Selenium (2)为什么使用selenium? (3)代码演示 2. selenium的基本使用 (1)如何安装selenium (2…...

springboot 对接 minio 分布式文件系统
1. minio介绍 Minio 是一个基于Go语言的对象存储服务。它实现了大部分亚马逊S3云存储服务接口,可以看做是是S3的开源版本,非常适合于存储大容量非结构化的数据,例如图片、视频、日志文件、备份数据和容器/虚拟机镜像等,而一个对象…...

前端小练习:案例4.3D图片旋转展示(旋转木马)
一.效果预览图 二.实现思路 1.实现旋转木马效果的第一步是先准备好自己需要的图片,创建html文件 2.旋转木马的实现,关键点在3D形变和关键帧动画。 3.步骤,定义一个div使其居中,,把图片放进div盒子里,因为图…...

Linux这17个操作技巧是每个运维工程师应知必会的吧?
今天跟大家分享17个linux运维中常用的操作技巧!掌握好这些技巧,或许某一天能够让老板给你涨工资! 1、查找当前目录下所有以.tar结尾的文件然后移动到指定目录: find . -name “*.tar” -exec mv {}./backup/ ; ❝ 注解࿱…...

音视频基础:分辨率、码率、帧率之间关系
基础 人类视觉系统 分辨率 像素: 是指由图像的小方格组成的,这些小方块都有一个明确的位置和被分配的色彩数值,小方格颜色和位置就决定该图像所呈现出来的样子;可以将像素视为整个图像中不可分割的单位或者是元素;像素…...

Java基础八 - HTTP相关/Cookie/Session/网络攻击
一、 反射/序列化/拷贝 1. 反射 //反射主要是指程序可以访问、检测和修改它本身状态或行为的一种能力 //在Yaml数据驱动自动化框架比较适用,能获取到当前的类名及方法名 import java.lang.reflect.*;public class ReflectionExample {public static void main(Str…...

【车道线】TwinLiteNet 复现过程全纪录
码字不易,喜欢的请点赞收藏!!!!! 论文全文翻译:【freespace】TwinLiteNet: An Efficient and Lightweight Model for Driveable Area and Lane Segmentation_莫克_Cheney的博客-CSDN博客 目录…...

七牛云获取qn(url、bucket、access-key、secret-key)
1.注册账号 2.access-key和secret-key: 点击“密钥管理” 复制AK和SK即可 域名: bucket: 这个就是对象存储空间名字 先新建一个空间(没买需要先购买),步骤如下: 填写存储空间名字࿰…...

定时任务实现 - Cron表达式知识
Cron表达式 cron表达式是一个字符串,由6到7个字段组成,用空格分隔。其中前6个字段是必须的,最后一个是可选的。每个字段的含义为:秒 分 时 日 月 周 年 字符解释: 枚举:, (cron“7,9,23****?”):任意时刻…...

【java】抽象
java抽象 抽象类抽象方法抽象类和抽象方法 抽象类 在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就…...

Qt应用开发(基础篇)——时间微调输入框 QDateTimeEdit、QDateEdit、QTimeEdit
一、前言 QAbstractSpinBox是全部微调输入框的父类,这是一种允许用户通过点击上下箭头按钮或输入数字来调整数值的图形用户界面控件,父类提供了当前值text、对齐方式align、只读readOnly等通用属性和方法。在上一篇数值微调输入框中有详细介绍。 QDateTi…...

日撸代码300行:第63天(集成学习之 AdaBoosting-1)
代码来自闵老师”日撸 Java 三百行(61-70天) 日撸 Java 三百行(61-70天,决策树与集成学习)_闵帆的博客-CSDN博客 学习过程中理解算法参考了:(十三)通俗易懂理解——Adaboost算法原…...

抽象父类获取子类的泛型 或接口泛型
jie通过getClass().getGenericSuperclass()或者子类的泛型 getClass().getGenericInterfaces();获取多个接口的泛型 GenericTypeResolver.resolveTypeArgument(GenericityService.class, GenericitySuper.class) 抽象父类 public abstract class GenericitySuper<T> …...

题目:2341.数组能形成多少数对
题目来源: leetcode题目,网址:2341. 数组能形成多少数对 - 力扣(LeetCode) 解题思路: 使用哈希表对数组中元素及其出现次数计数后对其进行统计即可。 解题代码: class Solution {public …...

NB-IOT 和蜂窝通信(2/3/4/5G)的区别和特点是什么?
NB-IOT 和蜂窝通信(2/3/4/5G)的区别和特点是什么? 参考链接:https://www.sohu.com/a/221664826_472880 NB IOT是窄带物联网技术,主要解决的是低速率数据传输,可使用GSM900或DCS1800频段,在频段使用上比较灵活,可以和GSM,UMTS或LTE共存,具备优异的MCL(最小耦合损耗…...

vue3 动态导入src/page目录下的所有子文件,并自动注册所有页面组件
main.js添加一下代码: const importAll (modules) > {Object.keys(modules).forEach((key) > {const component key.replace(/src/, /).replace(.vue, );const componentName key.split(/).slice(-2, -1)[0] -page;app.component(componentName, modules…...

python优雅地爬虫
申明:仅用作学习用途,不提供任何的商业价值。 背景 我需要获得新闻,然后tts,在每天上班的路上可以听一下。具体的方案后期我也会做一次分享。先看我喜欢的万能的老路:获得html内容-> python的工具库解析࿰…...

mysql8查看执行sql历史日志、慢sql历史日志,配置开启sql历史日志general_log、慢sql历史日志slow_query_log
0.本博客sql总结 -- 1.查看参数 -- 1.1.sql日志和慢sql日志输出方式(TABLE/FILE)。global参数 SHOW GLOBAL VARIABLES LIKE log_output; -- 1.2.sql日志开关。global参数 SHOW GLOBAL VARIABLES LIKE general_log%; -- 1.3.慢sql日志开关。global参数 SHOW GLOBAL VARIABLE…...

vscode关闭绑定元素“xxx”隐式具有“any”类型这类错误
在ts的项目里面,真的经常看到any类型的报错,真的很烦的 所以为了眼不见心不乱,我决定消除这个错误提示 在tsconfig.json里面配置 "noImplicitAny": false 就可以了 {"compilerOptions": {"target": "E…...
View绘制流程-Window创建
前言: View绘制流程中,主要流程是这样的: 1.用户进入页面,首先创建和绑定Window; 2.首次创建以及后续vsync信号来临时,会请求执行刷新流程; 3.刷新流程完成后,会通知SurfaceFlin…...

Jenkins build包时虽然单元测试失败了,但是仍然可以成功build包(最终结束时build success)
1.尝试方案1: 尽管单元测试失败,Jenkins Maven仍然可以获得成功-Java 学习之路 将 -Dmaven.test.failure.ignorefalse 添加到 MAVEN_OPTS artifactoryMaven {goals "-U clean install -Dmaven.test.skipfalse -DallowSnapshotstrue -Dmaven.te…...

【vue3】基础知识点-setup语法糖
学习vue3,都会从基础知识点学起。了解setup函数,ref,recative,watch、comptued、pinia等如何使用 今天说vue3组合式api,setup函数 在学习过程中一开始接触到的是这样的,定义数据且都要通过return返回 <…...

idol!! 2023牛客暑期多校训练营6 C
登录—专业IT笔试面试备考平台_牛客网 题目大意:定义n!!等于与n的奇偶性相同的所有小于等于n的数的阶乘之和,问n!!的末尾有多少0 1<n<1e18 思路:因为末尾0的来源是2*5,而2的个数明显比5的个数多得多,所以末尾…...

深入理解Jdk5引入的Java泛型:类型安全与灵活性并存
深入理解Jdk5引入的Java泛型:类型安全与灵活性并存 在Java的中,有一个强大的工具,它可以让你在编写代码时既保持类型安全,又享受灵活性。**这个工具就是——泛型(Generics)。**本文将引导你深入了解Java…...

idea在控制台中输出文字显示乱码
VM options中加入下面这行 -Dfile.encodingutf-8...

hacksudo3 通关详解
环境配置 一开始桥接错网卡了 搞了半天 改回来就行了 信息收集 漏洞发现 扫个目录 大概看了一眼没什么有用的信息 然后对着login.php跑了一下弱口令 sqlmap 都没跑出来 那么利用点应该不在这 考虑到之前有过dirsearch字典太小扫不到东西的经历 换个gobuster扫一下 先看看g…...

CentOS 虚拟机磁盘扩容(非常实用)
新手村的选手在刚开始安装使用 CentOS 虚拟机时,很多选项都会按照推荐操作来,比如:磁盘推荐大小为 20 GB;但随着后面的使用,总会因为“磁盘根目录不足”原因,而导致软件无法安装、虚拟机无法正常运行等&…...

docker案例复现
$uri导致的CRLF注入漏洞 前期准备dockerdocker compose 漏洞配置 前期准备 docker 要完成这样的测试,需要我们有一定的环境,也就是需要大家去安装docker 更新系统软件包: sudo yum update 安装 Docker 的依赖软件包: sudo yum …...

淘宝资源采集(从零开始学习淘宝数据爬取)
1. 为什么要进行淘宝数据爬取? 淘宝数据爬取是指通过自动化程序从淘宝网站上获取数据的过程。这些数据可以包括商品信息、销售数据、评论等等。淘宝数据爬取可以帮助您了解市场趋势、优化您的产品选择以及提高销售额。 淘宝作为全球的电商平台,每天都有…...