C/C++面试总结

一、关键字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博客

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

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

相关文章

Java基础八 - HTTP相关/Cookie/Session/网络攻击

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

KingBaseDB对POINT类型和PATH类型的应用

前言 由于业务需要对坐标信息进行存储&#xff0c;包括中心点和区域坐标数组&#xff0c;然后就开始考虑数据的存储问题&#xff0c;刚开始想着用最简单的两个字段分别存储经度纬度&#xff0c;这样发现关联查询表可能会比较多&#xff0c;有点麻烦。之后想起来kingbase好像有…

linux中彻底卸载jenkins

要彻底卸载 Jenkins&#xff0c;你需要删除与 Jenkins 相关的文件、目录和配置。以下是一些步骤: 1. **停止 Jenkins 服务&#xff1a;** 在卸载 Jenkins 之前&#xff0c;首先停止 Jenkins 服务。使用以下命令停止 Jenkins 服务&#xff1a; sudo systemctl stop jenki…

Mr. Cappuccino的第56杯咖啡——Mybatis拦截器

Mybatis拦截器 概述应用场景项目结构实现分页查询其它拦截器的使用 概述 Mybatis允许使用者在映射语句执行过程中的某一些指定的节点进行拦截调用&#xff0c;通过织入拦截器&#xff0c;在不同节点修改一些执行过程中的关键属性&#xff0c;从而影响SQL的生成、执行和返回结果…

LLVM笔记2 Intermediate Representation (IR)

参考链接&#xff1a;https://llvm.org/devmtg/2019-04/slides/Tutorial-Bridgers-LLVM_IR_tutorial.pdf https://zhuanlan.zhihu.com/p/163063995 https://zhuanlan.zhihu.com/p/163328574 文章目录 IR的布局1. IR语法2.IR递归函数3.使用迭代的方式4.全局变量5.LLVM’s type s…

【模型加速部署】—— Pytorch自动混合精度训练

自动混合精度 torch. amp为混合精度提供了方便的方法&#xff0c;其中一些操作使用torch.float32&#xff08;浮点&#xff09;数据类型&#xff0c;而其他操作使用精度较低的浮点数据类型&#xff08;lower_precision_fp&#xff09;&#xff1a;torch.float16(half)或torch.…

(03)Unity HTC VRTK 基于 URP 开发记录

1.简介 本篇主要内容为&#xff1a;URP如何与VRTK结合、URP需要注意的地方、VRTK的功能进行阐述。 因项目本身要求要渲染出比较好的画质&#xff0c;所以抛弃了Unity默认渲染管线Built-in&#xff0c;使用URP进行渲染&#xff0c;当然也可以选HDRP&#xff0c;但考虑到后期项目…

Stable Diffusion教程(9) - AI视频转动漫

配套抖音视频教程&#xff1a;https://v.douyin.com/UfTcrcJ/ 安装mov2mov插件 打开webui点击扩展->从网址安装输入地址&#xff0c;然后点击安装 https://github.com/Scholar01/sd-webui-mov2mov 最后重启webui 下载模型 从国内liblib AI 模型站下载模型 LiblibAI哩…

锦程消费金融业务生变:App下架,部分自营信贷暂停

来源 | 镭射财经&#xff08;leishecaijing&#xff09; 被誉为消金房抵一哥的锦程消费金融&#xff0c;调整旗下自营信贷业务&#xff0c;展业回归房抵场景。 「镭射财经」独家获悉&#xff0c;锦程消费金融已暂停部分自营小额信贷业务&#xff0c;旗下锦囊贷App已经下架&am…

通过anvt X6和vue3实现图编辑

通过anvt X6 X6地址&#xff1a;https://x6.antv.antgroup.com/tutorial/about&#xff1b; 由于节点比较复杂&#xff0c;使用vue实现的节点&#xff1b; x6提供了一个独立的包 antv/x6-vue-shape 来使用 Vue 组件渲染节点。 VUE3的案例&#xff1a; <template><div…

软工导论知识框架(五)面向对象方法学

传统软件工程方法学适用于中小型软件产品开发&#xff1b; 面向对象软件工程方法学适用于大型软件产品开发。 一.四要素 对象&#xff0b;类&#xff0b;继承&#xff0b;传递消息实现通信 二.概念 1.对象&#xff1a;具有相同状态的一组操作的集合&#xff0c;对状态和操作…

数据挖掘全流程解析

数据挖掘全流程解析 数据指标选择 在这一阶段&#xff0c;使用直方图和柱状图的方式对数据进行分析&#xff0c;观察什么数据属性对于因变量会产生更加明显的结果。 如何绘制直方图和条形统计图 数据清洗 观察数据是否存在数据缺失或者离群点的情况。 数据异常的两种情况…

Golang实现Redis分布式锁解决秒杀问题

先写一个脚本sql&#xff0c;插入2000个用户 INSERT INTO sys_users (mobile, password) SELECT numbers.n AS mobile,$2a$10$zKQfSn/GCcR6MX4nHk3MsOMhJnI0qxN4MFdiufDMH2wzuTaR9G1sq AS password FROM (SELECT ones.n tens.n*10 hundreds.n*100 thousands.n*1000 1 AS n…

成功解决ubuntu-22.04的sudo apt-get update一直卡在【0% [Waiting for headers]】

成功解决ubuntu-22.04的sudo apt-get update一直卡在【0% [Waiting for headers]】 问题描述解决方案 问题描述 在下载安装包的时候一直卡在0% [Waiting for headers]&#xff0c;报错信息如下&#xff1a; Get:1 file:/var/cudnn-local-repo-ubuntu1804-8.5.0.96 InRelease […

[国产MCU]-BL602开发实例-PWM

PWM 文章目录 PWM1、BL602的PWM介绍2、PWM驱动API介绍3、PWM使用示例脉冲宽度调制(Pulse width modulation,简称PWM)是一种模拟控制方式,根据相应载荷的变化来调制晶体管基极或MOS管栅极的偏置,来实现晶体管或MOS管导通时间的改变,从而实现开关稳定电源输出的改变。这种方…

【目标检测系列】YOLOV1解读

前言 从R-CNN到Fast-RCNN&#xff0c;之前的目标检测工作都是分成两阶段&#xff0c;先提供位置信息在进行目标分类&#xff0c;精度很高但无法满足实时检测的要求。 而YoLo将目标检测看作回归问题&#xff0c;输入为一张图片&#xff0c;输出为S*S*(5*BC)的三维向量。该向量…

react class与hooks区别

在React中&#xff0c;有两种主要的方式来管理组件的状态和生命周期&#xff1a;Class 组件和 Hooks。 Class 组件&#xff1a; Class 组件是 React 最早引入的方式&#xff0c;它是基于 ES6 class 的语法来创建的。Class 组件包含了生命周期方法&#xff0c;可以用来处理组件…

docker菜谱大全

记录docker常用软件安装&#xff0c;感谢小马哥和杨师傅的投稿。&#x1f60e;&#x1f60e;&#x1f60e; 相关文档&#xff1a; DockerHub&#xff1a;https://hub.docker.com/Linux手册&#xff1a;https://linuxcool.com/Docker文档&#xff1a;https://docs.docker.com/Do…

ubuntu 暂时不能解析域名 解决办法

需要修改系统DNS 打开终端&#xff1a;输入 sudo vi /etc/resolv.conf 回车 在打开的配置文件中添加DNS信息 nameserver 114.114.114.114 nameserver 8.8.8.8 保存退出&#xff0c;重启系统即可。

20230802-下载并安装android-studio

下载 android-studio 安装包 https://developer.android.google.cn/studio/ 安装android-studio 双击安装包 D:\Android Studio