深入浅出C语言(4)----static 和 sizeof

static在修饰变量的时候,如果是修饰全局变量,则跟全局变量功能一样;如果是修改局部变量,则每次调用的时候,保持着上一次的值;

示例1:
//file : main.c
static int a = 0;  //全局区,由于加了static,所以限定了其他的.c不能通过extern int a来调用
void test()
{
   int b = 0;    //栈区,每次test()调用结束后,b会被销毁,所以下次调用的时候,b的值是重新开始的
   static int c = 0; //全局区,编译器编译的时候,会把c放在全局区,因此下次调用test()函数的时候, c的保持不变
   b++;
   c++;
}

void main()
{
   int i=0;
   for(i=0;i<3;i++)
     test();
}

示例2:
//file main.c
static void test()
{
}

void main()
{
  test();
}

test函数由于被static修饰,限定了只能本文件中使用,不能在其他.c文件使用。
static的限定使用范围是怎么做到的呢??
其实就是编译器来限定的。当编译器扫描到static所修饰的函数或变量,而其他模块采用extern形式引用了,编译是可以通过的,但在链接的时候,链接器会发现static所修饰的变量或函数会被外部使用了,就会报错。

static语法上的意义是通过编译工具的链接工具来实现的。当编译链接完成后,生成了最终的汇编文件,那么我们还改动其中的汇编代码,还是能在其他模块中使用static函数与变量的。也就是,最终的二进制代码是无法做

到限制变量或函数使用范围的。


sizeof是用来判断一个变量及数据类型所占字节数的。
示例:
void main()
{
   int a = sizeof(int);
}

sizeof在编译器编译的时候,就已经算好了,所以上述的code对等效于:
void main()
{
   int a =4 ; //编译器编译的时候已经算出了sizeof的值
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值