C语言变量和全局变量能否重名问题

 更新时间:2024年08月21日 09:02:12   作者:Code repairman  
这篇文章主要介绍了C语言变量和全局变量能否重名问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

C语言变量和全局变量能否重名

解答

全局变量和局部变量是按照变量的作用域划分的。

简单地说,局部变量是定义在函数内部的变量;全局变量是定义在函数之外的变量。

全局变量可以为本文件中其他函数所共用。

局部变量和全局变量可以重名,局部变量会屏蔽全局变量。要使⽤全局变量,要在变量名前添加" :: "。

心得

局部变量和全局变量是可以重名的,因为它们的作用域不同。

在函数中,默认使用的是局部变量。

全局变量和局部变量重名了会怎么样

在交流群里面看到这样一个问题:

为什么这个程序中下面我定义的void型函数smart在全局变量前声明了,但是在man函数中调用了smart函数,m的值打印出来还是0。

#include<stdio.h>

int m;
void smart(void);

int main(void)
{
	printf("m = %d.\n", m);
	smart();
	printf("m = %d.\n", m);
	//m+=1;
	//printf("m = %d.\n", m);
	
	
	return 0;
}

void smart(void)
{
	int m = 25;
	
}

说实话,这个问题对于C语言有一个简单理解的肯定明白问题在哪里。但是,群里面人讲了半天没讲到重点,还是有点抓急。有讲局部变量函数执行结束自动释放的,所以全局变量的m没有被改变。有讲作用域不同的。千奇百怪的回答。

因为,能够搜到这篇文章的,大概率都是新手小白,我也就不会讲太深奥的东西了,尽量以简单易懂的语言讲明白。

全局变量和局部变量同名编译器是如何处理

(1)如果在函数内部同时存在一个局部变量和一个全局变量,它们的名字相同,那么在函数内部使用该变量时,将优先使用局部变量。

(2)举个现实生活的例子,两个除了长相不同,其他都一样的角色。一个是游戏活动期间才能玩的角色A,一个是你永久拥有的角色B。

  • 虽然他们的数值是一样的,但是对于绝大多数玩家而言,在活动期间大概率还是会优先用限时角色A。
  • 但是呢,游玩角色,打怪能够升级。可是角色A在活动结束之后,就会消失,那么活动期间你所得到的所有经验值都会消失。并不会反馈给永久角色B。
  • 最后,你只能愤愤不平,被官方摆了一套。

(3)根据上面这个举例,我们就很好理解了全局变量和局部变量同名情况了。

对于计算机而言,全局变量和局部变量究竟是什么?

(1)我们都知道,对于计算机而言,他本质上只能够识别0和1。哪些所谓的代码,变量名,其实都是给人类看的。因此,我们人类看到全局变量和局部变量名字一样,但是对于计算机而言是不一样的。

(2)这个将人类看的懂的语言,变成计算机能够看懂的01语言需要通过编译器来决定。

(3)当你在代码中写了一个全局变量m和一个局部变量m。编译器就会开辟两个不同的地址分别存放全局变量m和局部变量m。

  • 当你在smart()函数调用m变量的时候,编译器就会告诉机器,你应该操作的是地址A。
  • 当smart()函数调用结束的时候,编译器就会告诉机器,你应该操作的是地址B。同时机器会自己将地址A释放掉。
  • 那么你在地址A做的操作是无效的。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • C++画正弦线实例代码

    C++画正弦线实例代码

    这篇文章主要介绍了C++画正弦线实例代码,是C++图形操作程序设计中比较常见的一个技巧,需要的朋友可以参考下
    2014-10-10
  • OpenCV实现图像背景虚化效果原理详解

    OpenCV实现图像背景虚化效果原理详解

    相信用过相机的同学都知道虚化特效,这是一种使焦点聚集在拍摄主题上,让背景变得朦胧的效果。本文将详细介绍一些这一效果的实现原理以及代码,需要的可以参考一下
    2022-03-03
  • C++之WSAAsyncSelect模型实例

    C++之WSAAsyncSelect模型实例

    这篇文章主要介绍了C++的WSAAsyncSelect模型,实例讲述了socket与Windows消息机制的用法,需要的朋友可以参考下
    2014-10-10
  • C++函数模板与重载解析超详细讲解

    C++函数模板与重载解析超详细讲解

    模板是C++最重要的设计。这篇文章讲的是函数模板,只是简单介绍模板的一些功能,关于模板的更多的内容会在类模板中详细介绍。文章还着重介绍了重载解析过程
    2022-08-08
  • C++中signed main和int main的区别

    C++中signed main和int main的区别

    这篇文章介绍了C++中signed main和int main的区别,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-12-12
  • C语言 详细分析结构体的内存对齐

    C语言 详细分析结构体的内存对齐

    C 数组允许定义可存储相同类型数据项的变量,结构是 C 编程中另一种用户自定义的可用的数据类型,它允许你存储不同类型的数据项,本篇让我们来了解C 的结构体内存对齐
    2022-03-03
  • C/C++ Qt实现文章小说人物关系分析

    C/C++ Qt实现文章小说人物关系分析

    这篇文章主要为大家详细介绍了C/C++ Qt如何实现文章小说人物关系分析功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起了解一下
    2023-01-01
  • C语言超详细讲解数据结构中双向带头循环链表

    C语言超详细讲解数据结构中双向带头循环链表

    带头双向循环链表:结构最复杂,一般用在单独存储数据。实际中使用的链表数据结构,都是带头双向循环链表。另外这个结构虽然结构复杂,但是使用代码实现以后会发现结构会带来很多优势,实现反而简单
    2022-04-04
  • 深入Linux grep指令的详解(实用型)

    深入Linux grep指令的详解(实用型)

    本篇文章是对Linux下的grep指令进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • C++实现万年历功能

    C++实现万年历功能

    这篇文章主要为大家详细介绍了C++实现万年历功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-10-10

最新评论