变量的存储类型

2023-12-31 13:31:16

auto类型

简述:c和c++中的区别?

auto类型表示自动存储类型 :? 就是系统自动分配内存,使用结束后系统回收。?

其实auto类型就是我们平时定义的局部变量,所以我们定义一个auto类型的变量,加auto都可以。?

{
auto int a = 10;
}

上面这行代码, 其实和 int a = 10; 是一样的。????

但是,??

在C语言中,加不加auto都没有问题,不会报错。

在c++中,如果加了auto,是会报错的,因为c++中对auto进行了升级(有了一定的功能),并不是像C语言那样可写可不写。

?

register类型

1. 简述?:

?1. register类型表示寄存器类型, 顾名思义就是使用该类型定义的变量可以放到寄存器中(但并不是一定)。

寄存器是用来临时存储数据的, 因为其的执行速度比内存快的多,但是空间很小,所以一般将使用频率高的放到寄存器中,以提高效率。?鉴于这一点,我们可以在定义变量的时候,加register关键字,但是它不一定会被放到寄存器中,因为前面说了,放的都是频繁使用的,你随便定义一个数据,但是它整个程序就用一次,放进去不是浪费资源吗,或者,你定义之后,寄存器没有空间了,你当然也放不进去,所以并不是只要用register定义的变量都会往寄存器里面放。?

2. 对寄存器变量取地址: c和c++的区别

2. ?既然register定义的变量可能在寄存器中(即使它最后没有放到寄存器中),寄存器中是没有地址的,所以我们不能对register的变量进行寻址。(即使它最后没有放进去也不能)? ------? C语言

? ? 鉴于上面的情况c++进行了一些改变,?当你对寄存器变量进行取地址时,c++会将其降级为一个自动变量,自动变量当然在内存中存储,也有地址。 ------- c++

? ? 综上,对寄存器变量寻址,C语言不允许,c++允许。?

3. 注意: 全局变量不能加register。

?

extern类型?

1. 简述:?

说到这个类型,就要提到全局变量了,?

main.cpp:
int a = 10;

main1.cpp:
extern int a;

上面代码,main.cpp和main1.cpp是一个项目的两个源文件。?

在 main.cpp中定义了一个全局变量, 这个全局变量不仅可以在此源文件中使用,也可以在该项目的其它源文件中使用。?

而我们在其它源文件中使用别的源文件中的全局变量,就需要加一个声明,告诉编译器我们使用的这个变量是引用的外面文件的,这时候就需要使用extern关键字了。?

extern int a; 就是告诉编译器,如果没有定义一个变量a,那么这个a使用的是其它源文件的外部变量。?

注意: 如果使用extern不能对其初始化,如果初始化了,就表示在本源程序中定义了一个变量,而不是引用外部变量了。

例:? extern int a = 10; 这个就是在main1.cpp中定义了一个全局变量a(同一个项目中的各个源程序的全局变量名不能相同)。?

?

static类型?

1. 全局变量?

?前面说到extern关键字,可以使用别的源文件定义的全局变量,那么如果不想让别的源文件使用我们的全局变量,那么直接在顶以前加上static就可以了。?

2. 局部变量?

将static作用在局部变量上,那么它的生命周期就和程序一样了,但是只能作用域定义它的块内。?

void age()
{
  int age_boy = 1;
}

上面的函数中,我们想要每次调用函数,给age_boy加1,如果就像上面代码所示,是无法实现的,因为每次调用函数都重新定义,它的初始值永远都为1,但是我们加上static就不一样了,此时只有第一次调用函数会定义该变量,每次调用函数对其+1都是对上次的数据+1。?

文章来源:https://blog.csdn.net/weixin_68026222/article/details/135314275
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。