C语言全局变量和局部变量深入

局部变量

定义在函数内部的变量称为局部变量(Local Variable),它的作用域仅限于函数内部, 离开该函数后就是无效的,再使用就会报错。

示例

int f1(int a){int b,c;  //a,b,c仅在函数f1()内有效return a+b+c;
}
int main(){int m,n;  //m,n仅在函数main()内有效return 0;
}
解说:

1 . 在 main 函数中定义的变量也是局部变量,只能在 main 函数中使用;同时,main 函数中也不能使用其它函数中定义的变量。main 函数也是一个函数,与其它函数地位平等。

2 . 形参变量、在函数体内定义的变量都是局部变量。实参给形参传值的过程也就是给局部变量赋值的过程。

3 . 可以在不同的函数中使用相同的变量名,它们表示不同的数据,分配不同的内存,互不干扰,也不会发生混淆。

4 . 在语句块中也可定义变量,它的作用域只限于当前语句块。

全局变量

在所有函数外部定义的变量称为全局变量(Global Variable),它的作用域默认是整个程序,也就是所有的源文件,包括 .c 和 .h 文件。

示例:

int a, b;  //全局变量
void func1(){//TODO:
}float x,y;  //全局变量
int func2(){//TODO:
}int main(){//TODO:return 0;
}

a、b、x、y 都是在函数外部定义的全局变量。C语言代码是从前往后依次执行的,由于 x、y 定义在函数 func1() 之后,所以在 func1() 内无效;而 a、b 定义在源程序的开头,所以在 func1()、func2() 和 main() 内都有效。

局部变量和全局变量的综合示例

示例1 输出变量的值:

#include <stdio.h>int n = 10;  //全局变量void func1(){int n = 20;  //局部变量printf("func1 n: %d\n", n);
}void func2(int n){printf("func2 n: %d\n", n);
}void func3(){printf("func3 n: %d\n", n);
}int main(){int n = 30;  //局部变量func1();func2(n);func3();//代码块由{}包围{int n = 40;  //局部变量printf("block n: %d\n", n);}printf("main n: %d\n", n);return 0;
}

运行结果:

func1 n: 20
func2 n: 30
func3 n: 10
block n: 40
main n: 30

解说

代码中虽然定义了多个同名变量 n,但它们的作用域不同,在内存中的位置(地址)也不同,所以是相互独立的变量,互不影响,不会产生重复定义(Redefinition)错误。

1 . 对于 func1(),输出结果为 20,显然使用的是函数内部的 n,而不是外部的 n;func2() 也是相同的情况。

当全局变量和局部变量同名时,在局部范围内全局变量被“屏蔽”,不再起作用。或者说,变量的使用遵循就近原则,如果在当前作用域中存在同名变量,就不会向更大的作用域中去寻找变量。

2 . func3() 输出 10,使用的是全局变量,因为在 func3() 函数中不存在局部变量 n,所以编译器只能到函数外部,也就是全局作用域中去寻找变量 n。

3 . 由{ }包围的代码块也拥有独立的作用域,printf() 使用它自己内部的变量 n,输出 40。

4 . C语言规定,只能从小的作用域向大的作用域中去寻找变量,而不能反过来,使用更小的作用域中的变量。对于 main() 函数,即使代码块中的 n 离输出语句更近,但它仍然会使用 main() 函数开头定义的 n,所以输出结果是 30。

示例2 根据长方体的长宽高求它的体积以及三个面的面积。

#include <stdio.h>int s1, s2, s3;  //面积int vs(int a, int b, int c){int v;  //体积v = a * b * c;s1 = a * b;s2 = b * c;s3 = a * c;return v;
}int main(){int v, length, width, height;printf("Input length, width and height: ");scanf("%d %d %d", &length, &width, &height);v = vs(length, width, height);printf("v=%d, s1=%d, s2=%d, s3=%d\n", v, s1, s2, s3);return 0;
}

运行结果:

Input length, width and height: 10 20 30↙
v=6000, s1=200, s2=600, s3=300

解说

我们希望借助一个函数得到三个值:体积 v 以及三个面的面积 s1、s2、s3。遗憾的是,C语言中的函数只能有一个返回值,我们只能将其中的一份数据,也就是体积 v 放到返回值中,而将面积 s1、s2、s3 设置为全局变量。全局变量的作用域是整个程序,在函数 vs() 中修改 s1、s2、s3 的值,能够影响到包括 main() 在内的其它函数。

扫一扫获取更多精彩内容哟!!!
在这里插入图片描述

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

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

相关文章

python实例之 67,68

目录 67.题目&#xff1a;输入数组&#xff0c;最大的与第一个元素交换&#xff0c;最小的与最后一个元素交换&#xff0c;输出数组。 68.题目&#xff1a;有 n 个整数&#xff0c;使其前面各数顺序向后移 m 个位置&#xff0c;最后 m 个数变成最前面的 m 个数 今天这个不知道…

C语言块级变量

代码块&#xff0c;就是由{ }包围起来的代码。代码块在C语言中随处可见&#xff0c;例如函数体、选择结构、循环结构等。不包含代码块的C语言程序根本不能运行&#xff0c;即使最简单的C语言程序也要包含代码块。 C语言允许在代码块内部定义变量&#xff0c;这样的变量具有块级…

python实例 69,70

69.题目&#xff1a;有n个人围成一圈&#xff0c;顺序排号。从第一个人开始报数&#xff08;从1到3报数&#xff09;&#xff0c;凡报到3的人退出圈子&#xff0c;问最后留下的是原来第几号的那位。 先看一下第一种实现方式 nmax 50 n int(input(请输入总人数:)) num [] f…

C语言递归调用

一个函数在它的函数体内调用它自身称为递归调用&#xff0c;这种函数称为递归函数。执行递归函数将反复调用其自身&#xff0c;每调用一次就进入新的一层&#xff0c;当最内层的函数执行完毕后&#xff0c;再一层一层地由里到外退出。 递归函数不是C语言的专利&#xff0c;Java…

python实例 71,72

目录 71.编写input()和output()函数输入&#xff0c;输出5个学生的数据记录。 72.题目&#xff1a;创建一个列表。 71.编写input()和output()函数输入&#xff0c;输出5个学生的数据记录。 #71 N 3 #stu # num : string # name : string # score[4]: list student [] for i…

Dev-C++ 常用快捷键大全

最近开始用Dev-C在Window下编程&#xff0c;感觉Dec-C是一款挺不错的C编译器。我总结了一些使用技巧。 Dev-C 的一些常用快捷键 恢复 CtrlZ 重做 CtrlY 剪切 CtrlX 拷贝 CtrlC 粘贴 CtrlV 搜索替换内容 CtrlF 选择全部 CtrlA 编译 F9 运行 F10 编译运行 F11 设置注释 Ctrl/…

python实例 73,74

目录 73.题目&#xff1a;反向输出一个链表。 74.题目&#xff1a;列表排序及连接。 73.题目&#xff1a;反向输出一个链表。 #73 ptr [] for i in range(5):num int(input(请输入一个数字:))ptr.append(num) print (输入原顺序列表,ptr) ptr.reverse() print (输入反顺序…

C语言简单计算器

用C语言实现简单的计算器功能。 简单计算器&#xff0c;实现简单的加减乘除功能&#xff0c;选择对应的运算符输出运算符对应的编号&#xff0c;然后输入我们要计算的两个数&#xff0c;程序会给出计算结果。 效果演示 简单计算器代码 /* 简单计算器 name:zsh */ #include…

python实例 75,76

目录 75.判断情人节 76. 题目&#xff1a;编写一个函数&#xff0c;输入n为偶数时&#xff0c;调用函数求1/21/4...1/n,当输入n为奇数时&#xff0c;调用函数1/11/3...1/n 75.判断情人节 #75 import timeif __name____main__:datetime.strftime(%m-%d,time.localtime())if d…

python实例 77,78

目录 77.题目&#xff1a;循环输出列表 78.找到年龄最大的人&#xff0c;并输出。 77.题目&#xff1a;循环输出列表 #77 s ["man","woman","girl","boy","sister"] for i in s:print(i) 返回&#xff1a; 或者是 s …

python实例 79,80

目录 79.字符串排序 80.猴子分桃 79.字符串排序 #79 list1[] str1input(请输入第一个字符串&#xff1a;) str2input(请输入第二个字符串&#xff1a;) str3input(请输入第三个字符串&#xff1a;) list1.extend([str1,str2,str3]) list1.sort() print (排序后的字符串为&am…

C语言带参数的宏定义

C语言允许宏带有参数。在宏定义中的参数称为“形式参数”&#xff0c;在宏调用中的参数称为“实际参数”&#xff0c;这点和函数有些类似。 对带参数的宏&#xff0c;在展开过程中不仅要进行字符串替换&#xff0c;还要用实参去替换形参。 带参宏定义的一般形式为&#xff1a…

python实例 81,82

目录 81.题目&#xff1a;809*??800*??9*?? 其中??代表的两位数, 809*??为四位数&#xff0c;8*??的结果为两位数&#xff0c;9*??的结果为3位数。求??代表的两位数&#xff0c;及809*??后的结果。 82.题目&#xff1a;八进制转换为十进制 81.题目&#xf…

C语言带参宏定义和函数的区别

带参数的宏和函数区别&#xff1a; 宏展开仅仅是字符串的替换&#xff0c;不会对表达式进行计算&#xff1b;宏在编译之前就被处理掉了&#xff0c;它没有机会参与编译&#xff0c;也不会占用内存。而函数是一段可以重复使用的代码&#xff0c;会被编译&#xff0c;会给它分配内…

python实例 83,84

目录 83.题目&#xff1a;求0—7所能组成的奇数个数。 84.题目&#xff1a;连接字符串 83.题目&#xff1a;求0—7所能组成的奇数个数。 程序分析&#xff1a; 组成1位数是4个。 组成2位数是7*4个。 组成3位数是7*8*4个。 组成4位数是7*8*8*4个。 ...... #83 sum 0 …

C语言条件编译详解

我们要开发一个C语言程序&#xff0c;让它输出红色的文字&#xff0c;并且要求跨平台&#xff0c;在 Windows 和 Linux 下都能运行&#xff0c;怎么办呢&#xff1f; 这个程序的难点在于&#xff0c;不同平台下控制文字颜色的代码不一样&#xff0c;我们必须要能够识别出不同的…

python实例 85,86

目录 85.题目&#xff1a;输入一个奇数&#xff0c;然后判断最少几个 9 除于该数的结果为整数 86.题目&#xff1a;两个字符串连接程序 85.题目&#xff1a;输入一个奇数&#xff0c;然后判断最少几个 9 除于该数的结果为整数 程序分析&#xff1a;999999 / 13 76923 #85 a…

Python安装与环境变量的配置

Python安装与环境变量的配置 python下载&#xff1a; Python安装包下载地址 1 . 选择Windows系统的 2 . 选择相应的32/64位版本点击下载 python安装&#xff1a; 1 . 下载完成后&#xff0c;使用管理员身份进行安装 注意&#xff0c;勾选“Add Python 3.6 to PATH”选项…

python实例 87,88

目录 87.题目&#xff1a;回答结果&#xff08;结构体变量传递&#xff09; 88.题目&#xff1a;读取7个数&#xff08;1—50&#xff09;的整数值&#xff0c;每读取一个值&#xff0c;程序打印出该值个数的&#xff0a; 87.题目&#xff1a;回答结果&#xff08;结构体变量…

C语言指针是什么

情景进入 计算机中所有的数据都必须放在内存中&#xff0c;不同类型的数据占用的字节数不一样&#xff0c;例如 int 占用 4 个字节&#xff0c;char 占用 1 个字节。为了正确地访问这些数据&#xff0c;必须为每个字节都编上号码&#xff0c;就像门牌号、身份证号一样&#xf…