首页 > 其他分享 >main(...) 函数

main(...) 函数

时间:2023-06-05 16:34:57浏览次数:45  
标签:... argc 函数 int argv 返回值 main


                                                                                    《目录》           

  • 最小的 main() 函数
  • 形参
  • 返回值
  • 获取 main() 函数的返回值
  • argc AND argv

最小的 main() 函数

int main(){ }
// 默认返回 return 0, int 不能改成 void 、float 。

形参

main 函数的标准写法:

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

第一个是无形参,第二、三个虽然写法不同但用于函数参数是等价的。

但 

main(...) 函数_字符串


按照 argv 与符号的优先级决定,前 argv 是指针,指向了char *型指针,后 argv是数组,数组的每一个元素都是char *型指针。

用于函数形参时,由于C的函数是传值调用的。

作为 "类型的数组" 的形参应该调整为 "类型的指针"。

在函数形参定义这个特殊情况下,编译器必须把数组形式改写成指向数组第 0 个元素的指针形式。

编译器只向函数传递数组的地址,而不是整个数组的拷贝。
 

void func(int *argv){ ...... }
void func(int argv[]){ ...... }
void func(int argv[9]){ ...... }

用于函数定义中这 3 种方式完全等价。

 

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

Xcode 加了个 const。

 

返回值

       每个函数的设计都有返回值,main() 函数也不例外。

       因为函数本质是一段代码,可以看成一个 "黑盒子"。

       在外面的函数看不出 "黑盒子" 的状态,因此 "黑盒子" 需要把当前的状态传递给另一个函数,方便判断状态、被调用等。

       每个函数都被 main() 函数直接或间接调用,没被 main() 函数直接或间接调用的函数在程序中是无用的。

       那 main() 函数会被 谁 调用呢 ?

       main() 函数是特殊的,main() 函数是程序的入口,main 是 C语言 的保留字。

       运行 main() 函数也就是运行了这个程序,而程序本身是一个进程的创建、加载、运行、消亡。

       linux 中执行一个程序其实是创建一个新进程而后把这个程序放入这个进程中。

       进程是由父进程 创建 出来的,所以 main() 函数是被创建 ta 的父进程调用。

       父进程需要拿到 main() 函数的返回值(0表示正常,负数表示失败),来判断程序是否正常运行或者说领导交给下属的事情,下属必须完成汇报情况。

                  p.s. C语言真正的启动函数[VC]

      

获取 main() 函数的返回值

       以最小的 main 函数示例。

       

main(...) 函数_数组_02

        为了达到好的视觉效果,最好创建一个文件夹在那里面测试。

        创建好了的话,把上图的代码写成一个 .c 文件(文件名,随意),如图。

        不同系统的编辑命令不一样,本篇文章为 Mac 系统。


main(...) 函数_父进程_03

Windows 和 Linux 部分命令

[Mac]

  1.    vim smallest_main.c     
  2.    输入 i
  3.    输入最小 main() 函数代码
  4.    摁 "esc" ,输入 " :wq " , 摁 "enter / return" 保存。

main(...) 函数_父进程_04

        输入ls命令可以看到刚刚创建的文件,再创建一个获取 main() 函数返回值的文件(文件名,随意)。

        

main(...) 函数_父进程_05

        

  1.    vim return.sh     p.s. 不同系统的命令行编辑命令不一样所以百度一下,您就知道。
  2.    输入 i
  3.    输入代码,见下图。
  4.    摁 "esc" ,输入 " :wq " , 摁 "enter / return" 保存。

main(...) 函数_字符串_06

     现在这个文件夹有俩个文件,分别是

main(...) 函数_字符串_07

     编译 smallest_main.c ,输入 gcc smallest_main.c。

main(...) 函数_字符串_08

      使用 shell 命令运行 return.sh 文件即可得到 main() 函数的返回值。

main(...) 函数_数组_09

 

argc AND argv

       argc和argv,是父进程给 main() 函数传参。

       接受 main() 函数的返回值是因为想知道事情办的怎么样,而传参是想提高函数的灵活性。

       函数设计可以没有参数,但这个函数的作用不大,一般是打印什么东西.....

       int main(void) 的书写方式很普遍。

       如果不传参,修改程序可能需要直接修改源代码。这对于软件用户来说,是无法接受的。

       父进程给 main() 函数传参是通过 argc、argv 俩个形参,argc、argv 名字是可以如普通函数形参随意取。

       argc、argv 是通用的写法,可读性好。 

       argc:int 类型,表示运行程序的时候给 main() 函数传递了几个参数。

       argv:字符串数组,这个数组用来存储多个字符串,一个字符串就是一个传去的参数,数量取决于 argc。   

       argv[0] 是第一个传去的参数,argv[1] 是第二个传去的参数......   

#include <stdio.h>

int main( int argc, const char *argv[] )
{
	printf("父进程有 %d 个交代\n", argc);
	for( int i = 0; i < argc; i ++ )
	     printf("第 %d 个交代是:  %s", i, argv);
	return 0;
}

         运行后发现默认传 1 个参数。

         可以先编译这个文件,接着运行程序 ./a.out 后面跟几个参数。

             e.g. 输入  ./a.out  one  two  three  4  five,这样就传了 6 个参数,./a.out 也算。

标签:...,argc,函数,int,argv,返回值,main
From: https://blog.51cto.com/u_13937572/6417557

相关文章

  • 2022-2023 春学期 矩阵与数值分析 C6 插值函数的应用
    2022-2023春学期矩阵与数值分析C6插值函数的应用原文C6插值函数的应用6.1插值型求积公式数值型求积公式用于解决难以找到原函数的积分问题问题描述:设\(f(x)\)是定义在\([a,b]\)上的可积函数,考虑带权积分\[I(f)=\int^b_a\rho(x)f(x)dx\]其中权函数\(\rho(x)\)......
  • pymysql.err.DataError: (1366, “Incorrect string value: ‘\\xF0\\x9F\\x92
    原因是字符串中有emoji数据。原因:字符串中有emoji字符,数据库是utf8无法识别解决方法:安装emoji库pipinstallemoji处理字符串:importemojis=emoji.demojize('......
  • Java集合List转树结构工具类-函数版
    工具类:packagecom.example.mindsa.util.tree;importcom.baomidou.mybatisplus.core.toolkit.support.SFunction;importlombok.SneakyThrows;importjava.lang.invoke.SerializedLambda;importjava.lang.reflect.Method;importjava.util.List;importjava.util.func......
  • git add 时报错 warning: in the working copy of 'package-lock.json', LF will...
    来源:https://blog.csdn.net/qq_43842093/article/details/128471953问题:执行gitadd.时报错: 原因:换行符的问题, Windows下换行符和Unix下的换行符不一样,git会自动转换。 解决办法: 执行如下命令:gitconfig--globalcore.autocrlffalse问题解决 ......
  • PE学习——导出表,加载dll并GetProcAddress获取函数地址的内在原理
    导出表一个可执行程序是由多个PE文件组成,这些PE文件依靠倒入表、导出表进行联系,导出表存储着PE文件提供给其他人使用的函数列表,导入表则存储着PE文件所需要用到的PE文件列表。从PE文件的角度去看,任何PE文件都可以有导入、导出表,从一般情况下来看,EXE文件不会提供导出表,也就是不会......
  • 类内构造函数前缀explicit
    只有一个参数的构造函数前面加上explicit,这样一来在创建对象时不会被转换类型,因调用构造函数时有explicit限制,如classMyClass{public:explicitMyClass(intvalue):data(value){}intgetData()const{returndata;}private:intdat......
  • Flask之钩子函数
    Flask之钩子函数类似django的中间件,作用就是在进入框架的之后http方法之前或返回response之前进行一些操作Flask的钩子函数可在注册时根据注册的app或者蓝图从而确定钩子函数作用的范围(可全局也可作用某一个蓝图)钩子函数钩子函数可以分为两层说明,第一层是 app 层,第二层则......
  • C++ 多态 虚函数virtual
    先解释虚函数,对于基类,子类继承基类后可能会调用其某个函数FA,而不同的子类继承了同一个基类后需要基类内某个同样的函数FA但又不是同个作用,此时则会在对应的子类内对应重载派生出FA_B函数和FA_C函数,而这时要求FA为虚函数(virtual)那为什么不各自写成一个函数B和C呢?这就是多态的意......
  • Linux下三组I/O复用函数的比较(select、poll、epoll)
        前面我们讨论了select、poll和epoll三组I/O复用系统调用,这三组系统调用都能同时监听多个文件描述符。它们将等待由timeout参数指定的超时时间,直到一个或多个文件描述符上有事件发生时返回,返回值是就绪的文件描述符的数量。返回0表示没有事件发生。现在我们从事件集、最......
  • Excel批量插入图片(Excel函数集团)
    批量插入图片,归函数集团管了?对,你没看错,就是函数集团的活!因为Microsoft365出了一个新函数:IMAGE!所以,以前折腾的那种一堆合并以后再贴进txt文本文件再贴回来的,没用了?是与不是,我们用实例来说话! ***一条不算太华丽的分割线***准备工作1:一堆图片图片还是那个图片,但保存的位置却不是那个......