先看例子
#include <stdio.h>
int a = 1;
int main()
{
void another_var();
printf("a = %d 全局变量a的地址是%d\n",a,&a);//地址:4210736
int a = 2;
printf("a = %d 局部变量a(main)的地址是%d\n",a,&a);//地址:1895596908
another_var();
printf("a = %d 局部变量a(main)的地址是%d\n",a,&a);//地址:1895596908
return 0;
}
void another_var()
{
printf("a = %d 全局变量a的地址是%d\n",a,&a);//地址:4210736
int a = 3;
printf("a = %d 局部变量a(another_var)的地址是%d\n",a,&a);//地址:1895596876
}
out:
a = 1 全局变量a的地址是4210736
a = 2 局部变量a(main)的地址是1895596908
a = 1 全局变量a的地址是4210736
a = 3 局部变量a(another_var)的地址是1895596876
a = 2 局部变量a(main)的地址是1895596908
//把main中的void another_var()声明放到定义局部变量a(main)下面结果相同
可以看到全局变量a一直分配有储存单元,在main函数中没有定义局部变量a,在函数another_var中没有定义局部变量a,程序都会首先找到全局变量a的地址。
其次,main()中的局部变量a(main)与another_var()中的局部变量a(another_var)是不同的存储单元,这和《C语言程序设计–谭浩强》书中的内容是不一致的,书中指出:“函数可以看作是一个复合语句”是不合理的。
函数跟复合语句还是有些区别的。
当main函数中定义局部变量a,这时候会重新给main函数中的局部变量a(main)分配内存,这里的a(main)的有效区间为一直到main函数的return 0;如果中间出现复合语句中有使用变量a,那么这个复合语句中的a是局部变量a(main),而不是全局变量。
但是如果在复合语句中再定义一个局部变量a(for),那么系统会再开辟一个内存存放局部变量a(for),复合语句执行完后局部变量a(for)销毁,这和函数是一样的。
比如:
#include <stdio.h>
int a = 1;
int main()
{
void another_var();
printf("a = %d 全局变量a的地址是%d\n",a,&a);
int a = 2;
printf("a = %d 局部变量a(main)的地址是%d\n",a,&a);
int i;
for(i=1;i<2;i++)
{
printf("a = %d for 全局变量a的地址是%d\n",a,&a);
int a =3;
printf("a = %d 局部变量a(for)的地址是%d\n",a,&a);
}
printf("a = %d 局部变量a(main)的地址是%d\n",a,&a);
}
out:
a = 1 全局变量a的地址是4210736
a = 2 局部变量a(main)的地址是-1866543880
a = 2 for 全局变量a的地址是-1866543880
a = 3 局部变量a(for)的地址是-1866543884
a = 2 局部变量a(main)的地址是-1866543880
可以看到在复合语句中直接使用a,找到的是局部变量a(main),而不是全局变量a,这和《C语言程序设计–谭浩强》书中的内容是一致的。
是挺麻烦的,所以还是不要随便起名字。