C语言静态全局指针常量的作用域和访问权限问题
本帖最后由 xf331785508 于 2013-9-8 22:57 编辑最近遇到了一种情况,不明白变量的作用域,特问问坛子:
如文件1: first.cstatic unsigned char varValueIV[] = {1,2,3,4};
static unsigned char varValueV[] = {1,2,3,4};
static unsigned char *const pVar1 = varValueIV;
static unsigned char *const pVar2 = varValueV;
void function1(void)
{
...
}
unsigned char *ReturnGlobalPoint(unsigned char tp)
{
if(0 == tp){
return pVar1;
}
else if(1 == tp){
return pVar2;
}
else{
return pVar1;
}
}
文件2:Second.cextern unsigned char *ReturnGlobalPoint(unsigned char);
void function(unsigned char *p)
{
if(NULL != p){
......
}
....
}
void function0(void)
{
function(ReturnGlobalPoint(0));
......
}如上,指针常量pVar1是静态全局变量,但又在Second.c文件中可调用。那这样的作用域不就与静态变量的作用域不一致了。是否是我的理解上有什么不对的吗? 本帖最后由 guew 于 2013-9-8 23:18 编辑
在第二个文件中的“ReturnGlobalPoint”是一个函数地址,只是告诉编译器去其他文件找这个函数实体。
编译器在文件1中找到这个函数实体,函数实体在文件1中调用pVar1。
所以,文件2没有读写pVar1变量,只是通过“ReturnGlobalPoint”函数在文件1中对其进行读写。
这不就是“接口”吗? guew 发表于 2013-9-8 23:07 static/image/common/back.gif
在第二个文件中的“ReturnGlobalPoint”是一个函数地址,只是告诉编译器去其他文件找这个函数实体。
编译器 ...
如果文件2中如下呢,不就是文件2对pVar1进行读写了:extern unsigned char *ReturnGlobalPoint(unsigned char);
void function(unsigned char *p)
{
unsigned char i = 0,value[] = {5,6,7,8};
if(NULL != p){
for(i = 0;i < 4;i++){
*p = value; //此处不就是对pVar1所指内存进行了读写操作??
}
}
....
}
void function0(void)
{
function(ReturnGlobalPoint(0));
......
} 本帖最后由 guew 于 2013-9-9 13:46 编辑
xf331785508 发表于 2013-9-9 11:54 static/image/common/back.gif
如果文件2中如下呢,不就是文件2对pVar1进行读写了:
“作用域”是对变量而言的,而不是对内存地址而言的。
文件2中的指针变量为p,文件1中的指针变量为pVar1,这是两个独立的变量,尽管它们有相同的赋值。
p的作用域在文件2,pVar1的作用域在文件1,这两个变量有相同的赋值。
你在文件2中的注释那行的意思是:对变量名为p的指针变量进行读写操作;p变量的作用域在文件2;p变量的值是在文件1中定义的函数的返回值。或者说p通过函数ReturnGlobalPoint间接赋值的,并没有直接通过pVar1赋值(如p = pVar1)。这就是为什么楼上说ReturnGlobalPoint为接口函数了,它为p和pVar1之间的通讯提供了一个接口,或者说桥梁,并允许这两个变量拥有独立作用域。
还想不通?
试试这么理解:变量有许多种,“浮点变量”、“整数变量”……当然也可以是“指针变量”。
如果把p和pVar1声明成浮点变量,pVar1的作用域在文件1,p的作用域在文件2,p是通过函数的返回值赋值的。
这样行不行?
guew 发表于 2013-9-9 13:27 static/image/common/back.gif
“作用域”是对变量而言的,而不是对内存地址而言的。
文件2中的指针变量为p,文件1中的指针变量为pVar1 ...
THKS,我忽略了形参指针p的存在,呵呵。明白了。虽然实参是静态变量,但形参通过与接口(与实参同模块)的调用获得了实参的地址,以传址调用实现了对静态变量的间接操作。 在文件2中,通篇没有出现文件1中的变量名字,不就行了。
变量名静态不代表,该内存地址只能被文件1的函数读写!! 典型的C语言接口型式,很多应用场合都需要用到的。
页:
[1]