第二周

变量的不同作用域

在代码中,位于不同区域的变量的名称可以相同,比如在主函数与其他函数中,相同名称的变量不能互相访问,在访问时需要借助指针。这就是因为变量的作用域不同,而不同变量也有不同的生存周期。
全局变量:在函数头声明,作用域是整个程序。
局部变量:在函数体中声明,作用域在函数内,在函数结束后,定义的变量也消失。
static定义变量:可以将变量转换为静态局部变量,可以使变量不在函数调用结束后消失,直到程序结束后,这个变量才被释放。
auto:让变量在函数调用结束后清空,下次调用时,auto定义的变量已经被清空,再次进入运算。
register:寄存器变量,让变量储存到寄存器中提高效率,但是由于寄存器的大小是有限的,编译器会自动优化哪些变量能够进入寄存器。
extern:定义变量使用,该变量可以在程序的任何一个地方定义,extern声明表示该变量已经在别处定义过,编译器继续向下寻找该变量,不要急着报错。

申请使用内存并释放

包含于<stdlib.h>头文件中的函数malloc,free,realloc,calloc。

malloc(内存长度)

申请一块连续的内存区域并随机赋值。malloc函数会返回一个void类型的指针,定义一个指针指向申malloc申请的内存,用指针访问这块内存地址。

#include <stdio.h>
#include <stdlib.h>
int main(void)
{
 int *pt;
 int n;
 printf("你想储存多少个数据:");
 scanf("%d",&n);
 pt=(int *)malloc(n*sizeof(int));
 for(int i=0;i<n;i++)
 scanf("%d",&pt[i]);
 for(int i=0;i<n;i++)
 printf("%d ",pt[i]);
 free(pt);
} 

calloc(想要初始化的值,内存长度)

calloc函数会申请一块内存区域,并自动初始化。

free(要释放的内存地址)

free函数能够释放一块内存,通常与申请内存配对使用。

realloc(目标内存地址,新的内存长度)

realloc函数可以更改已经申请的内存区域大小,如果realloc函数接受到的指针为NULL,则相当于调用malloc函数申请了一块内存,如果不是NULL,则修改原来内存区域的大小。
下面的代码可以由用户输入数据,每次输入一个数据,内存区域自动扩大。

#include <stdio.h>
#include <stdlib.h>
int main(void)
{
	int *pt=NULL;
	int n;
	int count=1;
	do
	{
		printf("input numbers(-1 to quit):");
		scanf("%d",&n);
		count++;
		pt=(int *)realloc(pt,count*sizeof(int));
		
		if (pt==NULL)
		printf("wrong");
		else
		pt[count-1]=n;
	}while(n!=-1);
	printf("numbers are:");
	for(int i=0;i<count;i++)
	printf("%d ",pt[i]); 
	free(pt);
} 

<string.h>中包含了一些内存函数
memcmp
memcpy

内存函数(包含于<string.h>头文件)

memcpy:内存复制
memmove:内存移动
memcmp:内存大小比较

文件的输入输出

FILE *pt:定义一个指向文件类型的指针。
fopen(“文件指针”,“打开方式”):以指定的打开方式来打开指针指向的文件。
fclose(文件指针):关闭所有打开的文件。
fprintf(文件指针,“内容”)
fscanf(指针,“内容”,目标)
fgets(数组名称,字符串大小,指针)
fputs(数组名称,指针)

结构体

结构体的创建:关键字struct;
如果想要输入的数据是包含各种类型的数据,结构体可以很方便地处理。
创建结构体–> 一个包含歌曲各种信息的简单结构体:

#include <stdio.h>
#include <string.h>
struct Music{
		char name[40];
		char nation[20];
		char singer[20];	
		int date;
			}music;
int main()
{
	printf("请输入音乐的名称:");
	scanf("%s",music.name); 
	printf("请输入音乐的国别:");
	scanf("%s",music.nation);
	printf("请输入音乐的歌手:");
	scanf("%s",music.singer);
	printf("请输入音乐的发行日期:");
	scanf("%d",music.date);
	printf("音乐的名称是:%s\n",music.name);
	printf("音乐的国别是:%s\n",music.nation);
	printf("音乐的歌手是:%s\n",music.singer);
	printf("音乐的发行日期是:%d\n",music.date);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值