储备知识: 作用域 链接 存储时期。
作用域即程序中可以访问变量的“范围”
空链接:代码块作用域和函数原型作用域的变量具有空链接,意味着该变量私有;
内部链接:具有文件作用域的变量,可以在文件内使用;
外部连接:可以在一个多文件的的任一文件使用。
int a;//文件作用域,外部链接
static int b; //文件作用域,内部链接
自动/寄存器/具有外部链接的静态/具有内部链接的静态/空链接的静态
程序清单12.1 hiding.c 代码块内的变量
/*hiding.c--展示变量的作用域*/
#include
int main (void)
{
int x = 30;//将全局变量X赋值为30
printf("当前位置打印的X为全局变量X其值为:%d\n",x);
if(++x<20);
{
int x = 40;//定义一个局部变量
printf("当前位置打印的X为局部变量X其值为:%d\n",x);
}
printf("当前位置打印的X为全局变量X其值为:%d\n",x);
return 0;
}
1,不带括号的代码块,这一点要主意不是所有的代码块都有一对花括号,比如if和for。自己 写程序的时候应避免出现不带花括号的代码块。
2,自动变量的初始化
int repid;//仅仅分配了内存空间,值不做任何保证
int tents = 5;//分配了空间和初始值
寄存器变量的申请不一定成功
register int a;
代码块作用域,空链接,自动存储时期
静态:是指存储该变量的内存地址保持固定
程序清单12.3 use_stat.c 展示使用静态变量
/*use_stat.c--展示静态变量的使用*/
#include
void show_stat(void);
int main (void)
{
int stat_ex;
for(stat_ex = stat_ex; stat_ex < 5; stat_ex++)
{
show_stat();
}
printf("全局变量stat_ex=%d\n", stat_ex);
return 0;
}
void show_stat(void)
{
static int stat_ex = 0;
int stat_exs = 1;
printf("第%d次调用show_stat()当前静态变量++stat_ex=%d\n\
当前自动变量++stat_exs=%d\n", ++stat_ex , stat_ex , stat_exs);
}
程序清单12.4 globa.c全局变量的使用示例
/*global.c--展示静态变量的使用*/
#include
int global_x = 0;
void show_global(void);
int main (void)
{
printf("当前在主函数中的开始部分global_x=%d\n",global_x);
show_global();
printf("当前在主函数中的结束部分global_x=%d\n",global_x);
return 0;
}
void show_global(void)
{
extern int global_x;
global_x++;
printf("当前在 show_global() 中global_x=%d\n",global_x);
}
共存在5个存储类型说明符: auto register static extern typedef
函数也具有存储类 extern 和static ,static会将函数限定在文件内使用。
程序清单12.14 示范使用malloc进行动态数组内存分配
/*show_malloc.c--示范使用malloc*/
#include
#include
int main(void)
{
double* ptd;
int max;
int number;
int i = 0;
puts("请输入您可能输入的浮点数个数的最大值");
scanf("%d",&max);
ptd=(double*)malloc(max*sizeof(double));
if(ptd==NULL)//如果分配失败返回 NULL
{
puts("内存分配失败,拜拜");
exit(EXIT_FAILURE);
}
puts("请输入您要输入的浮点数:");
while(i < max )
{
scanf("%lf",&ptd[i]);
i++;
}
printf("您共输入了%d个元素\n",number = i);
for(i = 0;i < number;i++)//类数组访问方式
{
printf("%7.2f ",ptd[i]);
}
printf("\n");
for(i = 0;i < number;i++)
{
printf("%7.2f ", *ptd++);//指针访问方式
}
free(ptd);//非常重要 如不释放可能造成内存泄漏的严重问题
return 0;
}
const:限定为常量
volatitle:易变量
restrict:只作用于指针,表明该指针是访问内存的唯一方式(有利于编译器对代码进行游戏化)。
本章完。