请问全局,局部,内部及外部变量和函数的区分?

采石工 2010-12-17 05:43:17
我想这些概念的区分一直困扰着大家?大家讨论一下,或者有没有解答这个问题的可信的参考源,给大家作为参考?

对于变量,我的看法是:
局部变量是函数体内定义的变量;
全局变量是不在函数体内定义的变量;
内部变量是无extern修饰的变量;
外部变量是有extern修饰的变量。(这里考虑了默认情况)

大家可以参考我的另一个帖子http://topic.csdn.net/u/20101217/15/44a505d2-233b-4011-9517-8d7c151e58d2.html

这里再说明一下,由于extern变量不能在局部定义,即在函数体内定义,所以局部变量都是内部变量,反之不成立,因为存在静态全局变量,它是全局的,又没有extern修饰,故又可以称呼静态全局变量为全局内部变量(附:谭老书上又把它称作静态外部变量,在这里的语境内,个人觉得不很贴切);外部变量都是全局变量,反之不成立,原因同上。

对于函数,我的看法是:
仍然套用局部变量和全局变量的定义,由于函数不能嵌套定义,所以所有的函数都是全局函数;然后全局函数再分为内部函数与外部函数,前者无extern修饰,这里只能是static;后者有extern修饰(这里也考虑了默认情况,参考前面的连接里的内容)。

上面的内部外部的意思可以理解成能不能在另一个文件内引用或调用。

末了,上面都是我的一己之见。欢迎大家拍砖!发言!
...全文
305 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
CandPointer 2010-12-17
  • 打赏
  • 举报
回复
LZ,不止是变量,函数也是一样的。

书上,一大堆拗口的话,太罗嗦了。

总之,static的,在内存中也是全局的,其实,都可以用指针来访问它。
所谓static/extern,文件/全局作用域,只是相当于编译器/链接器而言。


运行后,在内存中,要么是 函数内的局部变量。 要么是全局变量。就这么简单
(函数内的,static,也是可以认为是全局)

采石工 2010-12-17
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 quarryman 的回复:]

引用 5 楼 candpointer 的回复:

即使你用了 static,也是全局的。 其它文件,也可以访问。
static 和 extern 只是link的修饰符。
内存实际上是全局的




C/C++ code

file01.h
int * iptraaa;

file01.c
#include "file01.h"
static int aaa = ……
[/Quote]
上面的代码有误,改为

//1.c
#include <stdio.h>

void f();
int *pa;
static int a=10;

void main()
{

pa=&a;
printf("%d\n",a);
f();
printf("%d\n",a);
}

//2.c
extern int *pa;

void f()
{
*pa = 999;
}


采石工 2010-12-17
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 candpointer 的回复:]

即使你用了 static,也是全局的。 其它文件,也可以访问。
static 和 extern 只是link的修饰符。
内存实际上是全局的




C/C++ code

file01.h
int * iptraaa;

file01.c
#include "file01.h"
static int aaa = 0;
int * iptraaa = &aaa;


……
[/Quote]
你好,你说的没错,可以通过全局指针来访问另一个文件中的静态全局变量。下面是我利用你的例子改编的验证这一结论的例程。

//1.c
#include <stdio.h>

void f();
int *pa;
int a=10;

void main()
{

pa=&a;
printf("%d\n",a);
f();
printf("%d\n",a);
}

//2.c
extern int *pa;

void f()
{
*pa = 999;
}
wasx1 2010-12-17
  • 打赏
  • 举报
回复
恩,向楼主好好学习啦
OKZEUSHUANG 2010-12-17
  • 打赏
  • 举报
回复
呃 嗯 值得探讨啊 嘻嘻 材料
采石工 2010-12-17
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 candpointer 的回复:]

这段:【内部变量是无extern修饰的变量;
外部变量是有extern修饰的变量。(这里考虑了默认情况)】

,对于C来说,
默认都是 extern,写不写extern,都是一样的。
指明了static,才是文件作用域。——但实际上,其它源文件,通过指针,完全可以访问这个文件作用域的static
[/Quote]
所以我后面说考虑了默认情况。是的,这里的静态变量是静态全局变量或静态外部变量,它是全局的
hdusunny44 2010-12-17
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 candpointer 的回复:]

这段:【内部变量是无extern修饰的变量;
外部变量是有extern修饰的变量。(这里考虑了默认情况)】

,对于C来说,
默认都是 extern,写不写extern,都是一样的。
指明了static,才是文件作用域。——但实际上,其它源文件,通过指针,完全可以访问这个文件作用域的static
[/Quote]
美错,默认的是extern。
我觉得接下来可以讨论声明和引用的区别。
采石工 2010-12-17
  • 打赏
  • 举报
回复
我错了。参考维基百科http://en.wikipedia.org/wiki/External_variable,上面说an external variable is a variable defined outside any function block;a local variable is a variable defined inside a function block。全局变量和外部变量,局部变量和内部变量是一回事,它们都是按作用域对变量的划分。变量按照生存时间还可以分为静态变量和动态变量。

外部变量或全局变量可以分为静态外部变量(或静态全局变量,谭老的书上没有问题,先前太轻率了),和一般外部变量;内部变量或局部变量可以分为自动变量,寄存器变量和静态内部变量(或静态局部变量);静态变量分为静态全局变量,静态局部变量和一般外部变量(注意这里把静态分配内存的变量都称作静态变量了);动态变量分为自动变量和寄存器变量。这下结论与谭老的书比较一致了。

对于函数,由于函数不能嵌套定义,所以函数都是全局的,或者都是外部的,没有局部函数和内部函数;全局函数又分为静态函数和一般的外部函数或全局函数。谭书上又把静态函数称为内部函数,这里的内部函数应该不能按照前面所说的内部函数来理解。

同样地,上面所说的仍是一己之见,欢迎大侠拍砖!
CandPointer 2010-12-17
  • 打赏
  • 举报
回复
这段:【内部变量是无extern修饰的变量;
外部变量是有extern修饰的变量。(这里考虑了默认情况)】

,对于C来说,
默认都是 extern,写不写extern,都是一样的。
指明了static,才是文件作用域。——但实际上,其它源文件,通过指针,完全可以访问这个文件作用域的static
CandPointer 2010-12-17
  • 打赏
  • 举报
回复
即使你用了 static,也是全局的。 其它文件,也可以访问。
static 和 extern 只是link的修饰符。
内存实际上是全局的





file01.h
int * iptraaa;

file01.c
#include "file01.h"
static int aaa = 0;
int * iptraaa = &aaa;


file02.c
#include "file01.h"
*iptraaa = 999;
//此处,实际上,通过指针访问了另外一个文件内的static的变量
//static/extern只是修饰链接器,变量,实际上,还是全局的。


采石工 2010-12-17
  • 打赏
  • 举报
回复
是的,这一点帖子考虑了啊
[Quote=引用 1 楼 wonder2008 的回复:]

静态变量能存在与函数体内,也可以是文件内全局静态变量啊
[/Quote]
wonder2008 2010-12-17
  • 打赏
  • 举报
回复
静态变量能存在与函数体内,也可以是文件内全局静态变量啊

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧