xf331785508 发表于 2013-9-8 22:47:15

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:07:08

本帖最后由 guew 于 2013-9-8 23:18 编辑

在第二个文件中的“ReturnGlobalPoint”是一个函数地址,只是告诉编译器去其他文件找这个函数实体。
编译器在文件1中找到这个函数实体,函数实体在文件1中调用pVar1。
所以,文件2没有读写pVar1变量,只是通过“ReturnGlobalPoint”函数在文件1中对其进行读写。

墨非 发表于 2013-9-9 09:24:10

这不就是“接口”吗?

xf331785508 发表于 2013-9-9 11:54:29

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:27:45

本帖最后由 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是通过函数的返回值赋值的。
这样行不行?

xf331785508 发表于 2013-9-9 14:13:54

guew 发表于 2013-9-9 13:27 static/image/common/back.gif
“作用域”是对变量而言的,而不是对内存地址而言的。
文件2中的指针变量为p,文件1中的指针变量为pVar1 ...

THKS,我忽略了形参指针p的存在,呵呵。明白了。虽然实参是静态变量,但形参通过与接口(与实参同模块)的调用获得了实参的地址,以传址调用实现了对静态变量的间接操作。

Lavion 发表于 2013-9-10 14:35:29

在文件2中,通篇没有出现文件1中的变量名字,不就行了。
变量名静态不代表,该内存地址只能被文件1的函数读写!!

lo-lo25 发表于 2013-9-10 14:49:22

典型的C语言接口型式,很多应用场合都需要用到的。
页: [1]
查看完整版本: C语言静态全局指针常量的作用域和访问权限问题