static,const,auto各个关键字的作用域和用法

本文详细解释了C语言中auto、static、register三种变量类型的区别及用法,并通过实例展示了如何正确使用这些变量类型。此外,文章还深入探讨了static关键字在不同作用域中的应用,以及const指针的四种不同配置方式及其含义。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 int main()

{

    auto int i = 0;

    register int j = 0;

    static int k = 0;

    return 0;

}

 

这三个变量有什么区别?

 

auto变量存储在程序的栈中,默认属性

static变量存储在程序静态区中

register变量请求存储于CPU寄存器中

 

用法在现在的C编译器中 auto是变量的默认属性来  auto代表变量在栈上分配空间也就是局部变量

static主要用在需要保存前一次计算结构的场合

register是将变量请求放在寄存器中 在一些需要高处理速度的场合可以使用但是register只是请求寄存器变量,但不一定请求成功

 

 现在我们深入讨论一下 大家觉得下面的函数正确吗?为什么?

int* func1()

{

    register int i = 0;

    return &i;

}

 

int* func2()

{

    static int i = 0;

    return &i;

}

 

int* func3()

{

    auto int i = 0;

    return &i;

}

只有func2是正确,因为我们看存储位置,static的变量存储在程序静态区,静态区是进程中一个特殊的存储区,我们在后面的专题答疑中会讲解。 static变量在程序结束后才会释放,所以即使是局部的,也可以返回地址。

我们通常说的地址都是内存地址,所以寄存器变量不能用&符号取地址,我们没有办法在C语言中直接得到寄存器。所以func1不对,编译不过。

func3返回了一个auto局部变量的地址,可以编译通过,但是程序可能运行错误,因为auto变量在函数返回后就被释放,因此原来的地址将不再代表这个变量。

 

       static int i = 0;

 

       static int f()

     {

          static int i = 0;

          return i;

     }

 

这里一共出现了3static,它们代表的含义有区别吗?

static关键字指明变量的“静态”属性;

static关键同时具有“作用域限定符”的意义

static修饰的局部变量存储在程序静态区

static的另一个意义是文件作用域标示符:static修饰的全局变量作用域只是声明的文件中

                                                                        static修饰的函数作用域只是声明的文件中       

 

 

因此第一个 static int i = 0;是说这个全局变量是能在定义的文件使用外部不能用extern来使用了

第二个 static int f()也是说这个函数只能在定义的文件中调用,即f()将为这个源文件所私有,其他文件不能使用的

第三个指的是静态局部变量,其作用域是定义的函数中,生命周期是程序运行期,静态局部变量,虽然生命周期是程序运行期,但是,可见性是在函数内

 

 

const int* p;      

int const* p;       

int* const p;       

const int* const p;

 

这个知识点常考,大家觉得这几个p有没有区别?

很多初学者对这个问题都很头疼,其实我们只要记住一个口诀,就全部清楚了。

口诀:左数右指

const出现在*号左边时指针指向的数据为常量

const出现在*后右边时指针本身为常l量

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值