1、变量类型:
C语言的变量分为局部变量和全局变量。
1.局部变量:
指在函数内部或者块内部(即一对花括号包含的区域)[以下均称为块]定义的变量,只对块范围内有效。
特点:不同块中可以有同名变量名,代表不同的变量,互不干扰;函数形参也是局部变量。
2.全局变量:
在函数之外定义的变量,从定义处开始到文件结束均有效,当然可以使用extern修饰将其范围扩大到其他文件。
特点:如果局部变量和全局变量同名,那么在局部变量作用范围内外部变量不起作用;在不必要是尽量不要使用全局变量,因为其降低了函数的通用性。
2、实验
另外加上static和const关键字之后,这些变量又是怎么存储的呢?下面的代码在linux系统调试通过:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int int_a=1;
static int static_int_a=2;
const int const_int_a=3;
int main ()
{
int int_b=1;
static int static_int_b=2;
const int const_int_b=3;
int *p1=malloc(4);
printf(" int_a: %p\n",&int_a);
printf("static_int_a: %p\n",&static_int_a);
printf(" const_int_a: %p\n",&const_int_a);
printf(" int_b: %p\n",&int_b);
printf("static_int_b: %p\n",&static_int_b);
printf(" const_int_b: %p\n",&const_int_b);
printf(" p: %p\n",&p1);
printf(" main: %p\n",main);
printf("%d\n",getpid());
while (1);
}
下图是调试结果:
下图是程序运行时的maps文件:
3、结果
通过上面的代码实验可以看出
1、 普通全局变量和static修饰的全局变量存放在全局区(程序运行时把这些数据存进栈中),但是const修饰的全局变量存放在代码区(程序运行时该数据存在只读Memory中)。
2、 普通局部变量和const修饰的局部变量存放在栈里面,但是static修饰的存放在了全局区。
4、杂记
一、const修饰符
1.修饰的变量必须初始化:
const int i=1;//合法
const int j;//非法
2.被修饰的变量只能被读:
const int i=1;
int j=2;
i=j;//非法
j=i;//合法
3.可以避免不必要的内存分配:
#define STR "abcdef"
const char str[]="abcdef";
printf(STR);//为STR第一次分配内存
printf(str);//为str一次分配内存
printf(STR);//为STR第二次分配内存
printf(str);//已经不需要分配内存了
同样是一个常量字符串,宏定义在编译时候自动替换了,所以实际是很多的常量。
4.数值常量和指针常量区分:
int x=1;
const int y=2; //y是常量,初始化之后就不能修改y值了
const int *p1=&x; //p1指向的内容是常量,不可以修改
int * const p2=&x; //指针p2是常量,所指向的内容可修改
const int * const p3=&x;//指针p3和p3指向的内容均不可以修改
p1=&y;//合法
*p2=3;//合法
5.const的常量未必一定不可以修改
const int x=1;
int *p=(int*)&x;
*p=2;// 此时的x的值便被修改为2了