变量的不同作用域
在代码中,位于不同区域的变量的名称可以相同,比如在主函数与其他函数中,相同名称的变量不能互相访问,在访问时需要借助指针。这就是因为变量的作用域不同,而不同变量也有不同的生存周期。
全局变量:在函数头声明,作用域是整个程序。
局部变量:在函数体中声明,作用域在函数内,在函数结束后,定义的变量也消失。
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);
}