主函数参数&缓冲区的理解

1、主函数传参
int main(int argc,char *argv[],char *envp[]);
argc:传递的参数列表中参数的个数
argv:传递的参数列表
envp:传递的环境变量

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

int main(int argc,char *argv[],char *envp[])
{
	int i = 0;
	for(; i < argc; ++i)
	{
		printf("%s\n",argv[i]);
	}
	exit(0);
}

在这里插入图片描述
可以看到,传递的参数以空格区分开,那么传整个字符串可以写进“字符串”或者使用“\ ”转义字符。
在这里插入图片描述
主函数默认接收一个参数,就是执行的命令。

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

int main(int argc,char *argv[],char *envp[])
{
	int i = 0;
	while(envp[i] != NULL)
	{
		printf("%s\n",envp[i]);
	}
	exit(0);
}

在这里插入图片描述
2、缓冲区的深入理解

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

int main()
{
	printf("hello");
	sleep(5);
	printf("world\n");
} 

这个代码执行时,并不是打印出“hello”,睡眠5秒钟后,再打印“world”。而是将“hello”写到输出缓冲区中,睡眠5秒钟后,再将“world”写到输出缓冲区中进而显示到界面上。

        缓冲区又称为缓存,它是内存空间的一部分,也就是说,在内存空间中预留了一定的存储空间,用来缓冲输入或输出的数据,这部分预留的空间就是缓冲区。
        为什么引入缓冲区?
        比如我们在磁盘读取数据的时候,先把数据放在缓冲区中,计算机再直接从缓冲区读取数据,等缓冲区中数据取完后再去磁盘读取,这样就可以大大减少对于磁盘的读写次数,再加上计算机对缓冲区的操作远远快于对磁盘的操作,所以应用缓冲区可以大大提高计算机的运行速度。
        缓冲区就是一块内存区,它用在输入输出设备和CPU之间,用来缓存数据。它使得低速的输入输出设备和高速的CPU能够协调工作,避免低速的输入输出设备占用CPU,解放出CPU,使其能够高效率工作。
        输出缓冲区刷新的条件:

  • 程序结束

  • 遇到“\n”

  • 缓冲区满(默认1024字节)

  • 主动刷新 fflush(stdout);
            结合缓冲区谈谈C语言getchar()、getche()、getch()的区别
    – 缓冲区    头文件    回显
    getchar() 有缓冲区 stdio.h 有回显
    getch()    无缓冲区 conio.h 无回显
    getche()  无缓冲区 conio.h 有回显

  • int getchar(void)
            当程序调用getchar()函数时,程序就等着用户按键,用户输入的字符被存放在键盘缓冲区中,直到用户按回车为止(回车字符也放在缓冲区中)。当用户键入回车之后,getchar()函数才开始从键盘缓冲区中每次读入一个字符。也就是说,后续的getchar()函数调用不会等待用户按键,而直接读取缓冲区中的字符,直到缓冲区中的字符读完后,才重新等待用户按键。

  • getch()和getche()
            getch()的作用是从键盘接收一个字符,且不带回显。就是说,你按了一个键后它并不在屏幕上显示你按的什么,而继续运行后面的代码,所以在C语言中可以用它来实现“按任意键继续”的效果,即程序中遇到getch();语句,就会停下来,等你按任意键,它接收了这个字符键后再继续执行后面的代码。
    getche()和getch()很相似,它也需要引入头文件conio.h,它们之间的区别就在于:getch()无回显,getche()有回显。

  • exit()和_exit()
    在这里插入图片描述
    _exit()函数的作:直接使进程终止运行,清除其使用的内存空间,并销毁其在内核中的各种数据结构;
    exit()函数在调用exit系统调用之前要检查文件的打开情况,把文件缓冲区中的内容写回文件,就是图中的"清理I/O缓冲"一项。

  • atexit()

        按照ISO C规定,一个进程可以登记多至32个函数,这些函数将由exit或者从main函数中返回时自动调用。我们称这些函数为终止处理程序,并调用atexit函数来登记这些函数。
函数原型
int atexit(void (*function)(void))
返回值:若成功,返回0;若错误返回非0;
其中,atexit的参数是一个函数地址,当调用此函数时无需向他传递任何参数,也不期望它返回一个值。exit调用这些函数的顺序与它们登记时候的顺序相反。同一函数如若登记多次,也会被调用多次。

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

void fun1()
{
	printf("i am fun1\n");
}

void fun2()
{
	printf("i am fun2\n");
}

int main()
{
	atexit(fun1);
	atexit(fun2);
	printf("hello\n");
	printf("world\n");
	exit(0);
}

在这里插入图片描述
        通过程序示例我们验证得到:不管atexit的位置在哪,我们总是在程序正常结束前调用atexit所登记的函数,并且调用顺序与登记顺序相反,同一函数如若登记多次,也会被调用多次。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值