首页 > 其他分享 >【C语言】全局变量与局部变量

【C语言】全局变量与局部变量

时间:2024-01-13 22:14:07浏览次数:19  
标签:main 函数 局部变量 C语言 printf print 全局变量

在不同的函数之间传递数据时,可以使用如下方法:

  • 参数:通过形参和实参
  • 返回值:用 return 语句返回计算结果
  • 全局变量

全局变量与局部变量

全局变量:函数之外定义的变量称为全局变量(外部变量);
局部变量:在一个函数内部定义的变量称为局部变量(内部变量)。
全局变量使用:

#include <stdio.h>

int i = 10; //全局变量

void print() {
    printf("print i=%d\n",i);
}

int main() {
    printf("main i=%d\n",i);
    i=5;
    print();
    return 0;
}

全局变量存储在数据段,所以对于 main 函数和 print 函数都是可见的。

全局变量在整个进程的执行过程中始终有效,不会因为某个函数执行结束而消失。
局部变量存储在自己的函数对应的栈空间内,函数执行结束后,分配给该函数局部变量的空间将被释放。

如果局部变量和全局变量重名,将采取就近原则,即实际获取和修改的值是局部变量的值。

#include <stdio.h>

int i = 10; //全局变量

void print() {
    printf("print i=%d\n",i);
}

int main() {
    printf("main i=%d\n",i);
    int i=111;
    print(); 
    printf("main i=%d\n",i);
    return 0;
}

执行结果:

全局变量的注意点:

  • 全局变量可以为本文件中的其他函数共用,它的有效范围是从定义变量的位置开始到本源文件结束。
  • 全局变量在程序的全部执行过程中都占用存储单元,而不是仅在需要时才开辟单元。
  • 使用全局变量过多会降低程序的清晰性,在各个函数执行时都可能改变全局变量的值,程序容易出错。
  • 函数在执行时依赖于其所在的全局变量,如果将一个函数移到另一个文件中,还需要将有关全局变量也移过去。此时,若该全局变量与其他文件的变量同名,就会出错。

全局变量的滥用会降低程序的可靠性和通用性,因此一般约定通过”实参->形参”进行联系,而不使用全局变量。

局部变量的注意点:

  • 局部变量的有效范围是离自己最近的花括号内,如在for循环内定义的局部变量是不能用在for循环之外的。
  • 不同函数中可以使用相同名字的变量,他们存在于各自函数的栈空间内,互不干扰。
  • 形式参数也是局部变量,

标签:main,函数,局部变量,C语言,printf,print,全局变量
From: https://www.cnblogs.com/hzyuan/p/17963069

相关文章

  • 【C语言】模块划分、编译器工作原理
    模块划分在实际应用中,一个较大的C程序并不会把所有代码都放入main主函数中,而是进行模块化设计,每个程序模块作为一个源程序文件,再由若干源程序文件组成一个C程序。这样处理便于分别编写、分别编译、进而提高调试效率。#include<stdio.h>voidfunc1(){//函数声明并定义......
  • VS Code的C语言配置以及使用的傻瓜式教程
    VSCode的C语言配置以及使用的傻瓜式教程写在前面的话作者在学习使用vscode写C代码的时候,根据网上很多参差不齐的教程踩了不少的坑,很多教程在配置完成后总会出现一些普遍性的痛点,所以笔者决定写一篇傻瓜式的教程,帮助大家快速配置vscode,并成功运行C语言代码.作者水平有限,......
  • 【C语言】函数的声明、定义、调用
    函数要先声明后调用!函数的声明和定义函数的声明:把函数的名字、函数类型及形参类型、个数和顺序通知编译系统,以便在调用该函数时编译系统能正确识别函数并检查调用是否合法。函数的定义:对函数功能的确立,包括指定函数名、函数值类型、形参及其类型、函数体等,它是一个完整的、独......
  • 初识C语言struct关键字
    本人初学C语言,最近学习到了struct,分享以下自己的一些心得。struct是结构体关键字,里面可以包含多个成员,在描述一个复杂结构体时可以借助struct。打印时,“.”可以替代成“->”,即A->name。同时注意struct后是要加;的。#include<stdio.h>structPerson{ charname[10]; shortheigh......
  • C/C++程序的内存开辟——《初学C语言第55天》
    //————C/C++程序的内存开辟C++程序内存分配的几个区域://intt=2;//staticintr=1;//voidtest()//{//  statice=1;//  intn=1;//  intarr[10]={1,2,3,4};//  charg[]="helloworld";//  char*p="abcd";//  int*a=(int*)malloc......
  • 【C语言进阶篇】动态内存分配的六个常见错误
    <br>(文章目录)前言  <fontcolor=green>......
  • 初始化C语言中的复杂声明
    int*(*(*arr[5])())(); float(*(*b())[])(); void*(*c)(char,int(*)()); void**(*d)(int&,char**(*)(char*,char**));float(*(*e[10])(int&))[5];上一篇我们分析过这些声明表示什么意思,今天我们初始化下这些声明int*(*(*arr[5])())......
  • C语言int * (* (*fp1) (int) ) [10]声明是啥意思呢?
    intaa一个int类型的变量int*pp是一个指针变量,指向int类型对象const关键字,除非右边是一个类型说明符,那么它作用于该类型说明符,否则作用于左边的符号constint*p这里const右边是int类型说明符,所以作用于int,a是一个指针变量,指向const的int类型变量*p=1这样使用将会报错,因为指......
  • 考研408之C语言基础学习记录
    考研408之C语言基础学习记录汇总前言这篇文章是我决定考研后写下的C语言基础学习记录,因为在此之前我有过Java项目开发的相关经验,对基础语言的学习也有一些心得,所以学习C语言时也只是快速过一下语法重点,并进行记录总结。这里只是第一次学习C语言基础进行的知识总结,未涉及到刷题......
  • 【C语言高阶篇】结构体 —— 什么是内存对齐?
    (文章目录)前言  <fontcolor=green>......