C语言入门-全局变量
一、全局变量
- 定义在函数外面的变量是全局变量
- 全局变量具有全局的生存期和作用域
- 它们与任何函数无关,在任何函数内部都可以使用它们
#include <stdio.h>
int f(void);
// 全局变量
int gALL = 12;
int main(int argc, char const *argv[])
{
printf("in %s gALL=%d\n", __func__,gALL);
f();
printf("agn in %s gALL=%d\n", __func__,gALL);
return 0;
}
int f(void)
{
printf("in %s gALL=%d\n", __func__,gALL);
gALL += 8;
printf("agn in %s gALL=%d\n", __func__,gALL);
return gALL;
}
// in main gALL=12
// in f gALL=12
// agn in f gALL=20
// agn in main gALL=20
二、全局变量初始化
- 没有做初始化的全局变量会得到0值
- 指针会得到NULL值
- 只能用编译时刻已知的值来初始化全局变量
- 它们的初始化发生在main函数之前
三、被隐藏的全局变量
如果函数内部存在与全局变量同名的变量,则全局变量被隐藏
#include <stdio.h>
int f(void);
// 全局变量
int gALL = 12;
int main(int argc, char const *argv[])
{
printf("in %s gALL=%d\n", __func__,gALL);
f();
printf("agn in %s gALL=%d\n", __func__,gALL);
return 0;
}
int f(void)
{
// 这里定义一个名字相同的变量,那么全局的就被隐藏了
int gALL = 1;
printf("in %s gALL=%d\n", __func__,gALL);
gALL += 8;
printf("agn in %s gALL=%d\n", __func__,gALL);
return gALL;
}
// in main gALL=12
// in f gALL=1
// agn in f gALL=9
// agn in main gALL=12
四、静态本地变量
- 在本地变量定义时加上static修饰符就成为静态本地变量
- 当函数离开的时候,静态本地变量会继续存在并保持其值
- 静态本地变量的初始化只会在第一次进入这个函数时做,以后进入函数时会保持上次离开的值
#include <stdio.h>
int f(void);
int main(int argc, char const *argv[])
{
f();
f();
return 0;
}
int f(void)
{
static int all = 1;
printf("in %s all=%d\n", __func__,all);
all += 9;
printf("agn in %s all=%d\n", __func__,all);
return all;
}
// in f all=1
// agn in f all=10
// in f all=10
// agn in f all=19
注意事项
- 静态本地变量实际上是特殊的全局变量
- 它们位于相同的内存区域
- 静态本地变量具有全局的生存期,函数内的局部作用域
- static在这里的意思就是局部作用域(本地可以访问)
五、后记:返回指针的函数
- 返回本地变量的地址是危险的
- 返回全局变量或静态本地变量的地址是安全的
- 返回在函数内malloc的内存是安全的,但是容易造成问题
- 最好的做法是返回传入的指针
下面的写法就是很危险的
#include <stdio.h>
int* f(void);
void g(void);
int main(int argc, char const *argv[])
{
int *p = f();
printf("*p = %d\n", *p);
g();
printf("*p = %d\n", *p);
return 0;
}
int* f(void)
{
int i = 12;
// 返回本地变量的地址是危险的
return &i;
}
void g(void)
{
int k = 24;
printf("k = %d\n", k);
}
// *p = 12
// k = 24
// *p = 24
tips
- 不要使用全局变量来在函数间传递参数和结果
- 尽量避免使用全局变量
- 使用全局变量和静态本地变量的函数是线程不安全的
C语言入门-全局变量的更多相关文章
- 《Ruby语言入门教程v1.0》学习笔记-01
<Ruby语言入门教程v1.0> 编著:张开川 邮箱:kaichuan_zhang@126.com 想要学习ruby是因为公司的自动化测试使用到了ruby语言,但是公司关于ruby只给了一 ...
- c语言入门这一篇就够了-学习笔记(一万字)
内容来自慕课网,个人学习笔记.加上了mtianyan标签标记知识点. C语言入门 -> Linux C语言编程基本原理与实践 -> Linux C语言指针与内存 -> Linux C ...
- Go 语言入门(一)基础语法
写在前面 在学习 Go 语言之前,我自己是有一定的 Java 和 C++ 基础的,这篇文章主要是基于A tour of Go编写的,主要是希望记录一下自己的学习历程,加深自己的理解 Go 语言入门(一 ...
- 【Introduction】R语言入门关键小结
写在前面:本博客为本人原创,严禁任何形式的转载!本博客只允许放在博客园(.cnblogs.com),如果您在其他网站看到这篇博文,请通过下面这个唯一的合法链接转到原文! 本博客全网唯一合法URL:ht ...
- C语言入门基础整理
学习计算机技术,C语言可以说是必备的,他已经成为现在计算机行业人学习必备的,而且应用也是十分的广泛,今天就来看看拥有几年c语言工作经验的大神整理的C语言入门基础知识,没有学不会,只有不肯学. 结构化程 ...
- C/C++编程笔记:C语言入门知识点(三),请收藏C语言最全笔记!
今天我们继续来学习C语言的入门知识点,第一课:C/C++编程笔记:C语言入门知识点(二),请收藏C语言最全笔记! 21. 输入 & 输出 当我们提到输入时,这意味着要向程序填充一些数据.输入可 ...
- 《JavaScript语言入门教程》记录整理:运算符、语法和标准库
目录 运算符 算数运算符 比较运算符 布尔运算符 二进制位运算符 void和逗号运算符 运算顺序 语法 数据类型的转换 错误处理机制 编程风格 console对象和控制台 标准库 Object对象 属 ...
- 《JavaScript语言入门教程》记录整理:面向对象
目录 面向对象编程 实例对象与 new 命令 this关键字 对象的继承 Object对象的方法 严格模式(strict mode) 本系列基于阮一峰老师的<JavaScrip语言入门教程> ...
- 踢爆IT劣书出版黑幕——由清华大学出版社之《C语言入门很简单》想到的(1)
1.前言与作者 首先声明,我是由于非常偶然的机会获得<C语言入门很简单>这本书的,绝对不是买的.买这种书实在丢不起那人. 去年这书刚出版时,在CU论坛举行试读推广,我当时随口说了几句(没说 ...
随机推荐
- Xcode中.a文件引起的错误
一. TARGETS -> Build Settings-> Search Paths下 1. Library Search Paths 删除不存在的路径,保留.a文件的路径(此 ...
- BZOJ 3065 带插入区间K小值(sag套线段树)
3065: 带插入区间K小值 Time Limit: 60 Sec Memory Limit: 512 MBSubmit: 4696 Solved: 1527[Submit][Status][Di ...
- Mysql基础03-函数
函数 字符串函数 函数 用法 CONCAT(S1,S2,......,Sn) 连接S1,S2,......,Sn为一个字符串 CONCAT_WS(s, S1,S2,......,Sn) 同CONCAT ...
- 数理统计(一)——用Python进行方差分析
数理统计(一)——Python进行方差分析 iwehdio的博客园:https://www.cnblogs.com/iwehdio/ 方差分析可以用来推断一个或多个因素在其状态变化时,其因素水平或交互 ...
- 常见排序汇总C&C++
常见排序主要有以下四种: 1.交换排序 2.选择排序 3.插入排序 4.归并排序 (以下代码基本都有输出每步排序结果) 一.交换排序 交换排序主要是冒泡排序和快排 1.冒泡排序 流程: (1)对数组中 ...
- php数组去重、魔术方法、redis常用数据结构及应用场景
一.用函数对数组进行去重的方法 1.arrau_unique函数的作用 移除数组中重复的值. 将值作为字符串进行排序,然后保留每个值第一次出现的健名,健名保留不变. 第二个参数可以选择排序方式: SO ...
- 简单学习【1】——打包JS
webpack entry <entry> output webpack --config webpack.conf.js Step1:新建一个文件,里面有一个app.js 一个sum.j ...
- getX,getY,getScrollX,getScrollY,ScrollTo(),ScrollBy()辨析
前言:前两天看了自定义控件,其中有一些东西我觉得有必要深入理解一下 以下图为例: getX(),getY()返回的是触摸点A相对于view的位置 getRaw(),getRawY()返回的是触摸点B相 ...
- AWS re:Invent 2019参会有感
感谢AWS方面的邀请,以及公司给予的机会,近期有幸赴美参与了享有盛名的AWS re:Invent大会.会议期间自己还算勤勉,参加了尽可能多的session.现笔者也已回到国内,交个作业,写一篇短文作为 ...
- linux指令-date
1.在linux中要显示日期,则可以直接输入指令date 2.如果想以这样2016/12/26的方式输出呢,那就是,Y是年份,m是月份,d是日 date +%Y/%m/%d 3.如果要显示时间,则da ...