1

你真的了解main函数吗?

 2 years ago
source link: https://blog.csdn.net/qq_42253797/article/details/118100558
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
你真的了解main函数吗?_KOOKNUT的博客-CSDN博客_main函数

大家好,我是KookNut39,在CSDN写文,分享一些自己认为在学习过程中比较重要的东西,致力于帮助初学者入门,希望可以帮助你进步。最近在更新C/C++方面的知识,感兴趣的欢迎关注博主,可以去专栏查看之前的文章,希望未来能和大家共同探讨技术。

我们每写一个C程序或者C++程序,都需要敲下这样的一个函数名main,但是为什么要有main函数?main函数真实的面容又是什么样呢?
为什么要有main函数或者main函数的作用是什么?前两天一个初学者问我问题,说他的代码报错了,没法运行,然后我定睛一看,整个代码没有main函数,所以报错了!
在这里插入图片描述

这个问题对于已经入门的人来说,可能不会犯,但是对于新手来说,他感觉自己照着书上的代码写的,为什么连编译都不行呢?很是郁闷啊!!并且他并不理解,为什么写了main编译就通过了,但是我还是运行不出来想要的结果呢(main函数中没有调用他写的函数,也没有执行什么其它的操作),所以main函数究竟是干什么的?
我们平时见到的main函数大致是这个样子的:

int main()
{
	........
	return 0;
}
void main()
{
	........
	return;
}

main函数是C语言或者C++程序的一个入口,我们需要编译生成一个可执行项目的过程中会经过好几个阶段,而在生成的可执行文件中,main函数就是它的入口,就好比我们需要盖一个房子,为了我们进出方便,肯定是有一个大门,房子里面有厨房、洗手间、卧室、书房等等的细节,但是进入房子的门只有一个!而我们想要进到房子里面去睡觉、上洗手间,需要先打开房门,对于一个exe程序来说,main函数就是它的房门,没有房门,完全密闭的一个房子,里面不管有多么的精致,你也无法享受!通过这道房门,在房子里面装上各种功能器件,那就可以享受了!所以main函数是不可或缺的程序入口,也是一切的开始。
但是我们是否又见过这样的main函数呢?

int main(int argc, char* argv[],char *envp[])
int main(int argc, char** argv,char** envp)

嗯?main函数居然还有参数?为什么我从来没见过main函数的参数啊?这些参数我们怎么获得?那参数又是怎么传到程序中的呢?
确实!main函数是有参数的,你没有看错!我来解释一下这三个参数:
第一个参数是一个整型,其中包括的是命令行参数的个数,第二参数是一个二维的char型指针,存放命令行参数字符串,第三参数是二维的char型指针,存放环境变量。那我们怎么获得命令行参数呢?写一个简答的示例代码:

int args_parse(int argc, char** argv)
{
	//argv[0] 是当前进程名
	int i = 0;
	while (i < argc)
	{
		printf("%s\r\n", argv[i]);
		i++;
	}
	return 0;
}
int main(int argc, char** argv, char** envp)
{
	args_parse(argc,argv);
	return 0;
}

我在函数args_parse中定义了两个参数,然后在main函数传参就直接把main函数参数传入进去,这些参数都是程序从外部获取的,我们只需要取出即可。当我们没有输入任何的命令行参数的时候,这个程序会输出当前进程名,因为命令行参数的第一参数是当前进程名:
在这里插入图片描述
使用命令行参数有什么作用?使用命令行参数可以控制程序的执行,我们的程序可能实现了很多的功能,就比如图书管理系统,有增加图书,查书籍等等不同的功能,这些功能有自己的代码段,我们如何可以定位去执行哪一段代码呢?这时候就可以利用参数的方式,我们在命令行传入的参数,就好比一个指令,在程序内部设计指令识别,然后对不同指令解析去执行不同的功能模块。那我们怎么传入命令行参数呢
我们可以从cmd传入,将当前可执行文件完整路径输入,接着随便输几个字符串,然后看看效果,举例:
在这里插入图片描述
我们在此处可执行文件完整路径后面输入的,都是命令行参数!那么新的问题来了,如果我代码有问题,想调试一下,但是调试过程中没法输入命令行参数啊,毕竟命令行参数是在main函数执行之前就传入的,这时候怎么办呢?我们拿vs举例:
在这里插入图片描述
右键选择当前项目,点击属性,然后点击调试–>命令行参数,然后输入就可以了:
在这里插入图片描述
动态操作流程:
在这里插入图片描述
每个进程都有一个与它相关的环境块,在进程地址空间分配时候会为环境变量分配一块内存,每个字符串的第一部分是一个环境变量的名称,后跟一个等号,等号之后是希望赋给此变量的值。这种字符不能作为环境变量使用。那么怎么获取环境变量呢?

void envp_parse(char** envp)
{
	int i = 0;
	char** Travel = envp;
	while (NULL != Travel)
	{
		if (NULL == *Travel)
		{
			printf("Envp Over!!!\r\n");
			return;
		}
		else
		{
			printf("%s\r\n", *Travel);
		}
		Travel++;
	}
}
int main(int argc, char** argv, char** envp)
{
	//args_parse(argc,argv);
	envp_parse(envp);
	getchar();
	return 0;
}

运行效果部分图:
在这里插入图片描述
有关main函数的简单科普就到此结束啦!下篇博文与各位再见面喽!!!

码字不易,如果喜欢,赏个点赞+评论+收藏🤞🤞🤞,感谢您的支持

惯例,今日份吟诗一句“数风流人物,还看今朝”
在这里插入图片描述


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK