C Primer Plus学习笔记----第12章----存储类、链接和内存管理

存储类、链接和内存管理

  • 12.1存储类
    • 12.2.1作用域
    • 12.1.2 链接
    • 12.1.3五种存储类
    • 12.1.4自动变量
    • 12.1.5 寄存器变脸
    • 12.1.6 具有代码块作用域的静态变量
    • 12.1.7 外部变量
  • 12.2 存储类型说明符
  • 12.3存储类和函数
  • 12.4随机函数和静态变量
  • 12.5掷骰子
  • 12.6分配内存:malloc()和free()
  • 12.7ANSIC的类型限定词

12.1存储类

储备知识: 作用域 链接 存储时期。

12.2.1作用域

作用域即程序中可以访问变量的“范围”

12.1.2 链接

空链接:代码块作用域和函数原型作用域的变量具有空链接,意味着该变量私有;
内部链接:具有文件作用域的变量,可以在文件内使用;
外部连接:可以在一个多文件的的任一文件使用。

int a;//文件作用域,外部链接
static int b; //文件作用域,内部链接

12.1.3五种存储类

自动/寄存器/具有外部链接的静态/具有内部链接的静态/空链接的静态

12.1.4自动变量

程序清单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;
} 

C Primer Plus学习笔记----第12章----存储类、链接和内存管理_第1张图片
1,不带括号的代码块,这一点要主意不是所有的代码块都有一对花括号,比如if和for。自己 写程序的时候应避免出现不带花括号的代码块。
2,自动变量的初始化

int repid;//仅仅分配了内存空间,值不做任何保证
int tents = 5;//分配了空间和初始值

12.1.5 寄存器变脸

寄存器变量的申请不一定成功

register int a;

代码块作用域,空链接,自动存储时期

12.1.6 具有代码块作用域的静态变量

静态:是指存储该变量的内存地址保持固定
程序清单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);
}

C Primer Plus学习笔记----第12章----存储类、链接和内存管理_第2张图片

12.1.7 外部变量

程序清单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); 	
}

C Primer Plus学习笔记----第12章----存储类、链接和内存管理_第3张图片

12.2 存储类型说明符

共存在5个存储类型说明符: auto register static extern typedef

12.3存储类和函数

函数也具有存储类 extern 和static ,static会将函数限定在文件内使用。

12.4随机函数和静态变量

12.5掷骰子

12.6分配内存:malloc()和free()

程序清单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;
}

C Primer Plus学习笔记----第12章----存储类、链接和内存管理_第4张图片

12.7ANSIC的类型限定词

const:限定为常量
volatitle:易变量
restrict:只作用于指针,表明该指针是访问内存的唯一方式(有利于编译器对代码进行游戏化)。

本章完。

你可能感兴趣的:(C Primer Plus学习笔记----第12章----存储类、链接和内存管理)