C - 基础 - 存储类、链接、内存管理

定义

存储类:即存储模型 自动、寄存器、具有外部链接的静态、具有内部链接的静态、空链接的静态,还有基于指针的类型。
作用域:作用范围
链接 : 是否可被外部引用
存储时期:变量在内存中保留的时间

作用域

代码块作用域:即方法体等类似范围
函数原型作用域:函数声明时范围
文件作用域:文件内函数外声明的范围,可被内部任何地方和其他文件引用,也称全局变量

链接

外部链接: 文件作用域,不用static修饰
内部链接: 文件作用域,使用static修饰
空链接: 代码块作用域 和 函数原型作用域 变量具有空链接

存储时期

静态存储时期: 静态变量在程序执行期间一直存在,具有文件作用域变量具有静态存储时期。
自动存储时期: 局部变量属于自动类型。

存储类

  • 寄存器变量 比自动变量访问快、无法获取地址
  • 代码块作用域的静态变量
  • 外部链接的静态变量 extern声明在其他文件中定义的变量
  • 具有内部链接的静态变量
#include <stdio.h>

void count();
int main(int argc, char *argv[])
{
	count();
	count();
	return 0;
}

void count()
{
    // 代码块作用域的静态变量
	static int count = 0;
	count++;
	printf("count = %d \n", count);
}

函数示例

掷骰子,随机数生成

头文件 dice.h

int roll(int max);
extern int count;

实现 dice.c

#include "dice.h"
#include <stdio.h>
#include <stdlib.h>

int count;

int roll(int max)
{
	count++;
	return rand() % max + 1;
}

调用 main.c

#include "dice.h"
#include <stdio.h>

int main(int argc, char *argv[])
{
	printf("掷骰子 1 次 : %d \n", roll(100));
	printf("掷骰子 2 次 : %d \n", roll(100));
	printf("总次数 : %d \n", count);
	return 0;
}

内存管理 malloc() 和 free()

创建动态数组,记得要free释放

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
	double * money;
	int max;
	int number;
	int i = 0;
	puts("要整个多大的数组啊?\b");
	scanf("%d", &max);

	money = (double *)malloc(max * sizeof(double)); // 类型指派 c不是必要,c艹必要
	if (NULL == money)
	{
		puts("空间不足");
		exit(EXIT_FAILURE);
	}

	puts("往数组放数吧 \n");
	while (i < max && scanf("%lf", &money[i]) == 1)
	{
		i++;
	}

	printf("你输入的是: %d \n", number = i);
	for (i = 0; i < number; i++)
	{
		printf("%7.2f ", money[i]);
	}
	puts("over. \n");
	free(money);
	return 0;
}

console:

malloc

posted @ 2017-05-11 13:14  张狂莫怪  Views(159)  Comments(0Edit  收藏  举报