但是还是有差异,所以在一个操作系统上写的应用程序不可能直接在另一个操作系统上面编译运行。于是乎就有个可移植性出来了。
(3)跨操作系统可移植平台,譬如QT、譬如Java语言。
8.4、<1>main()函数的写法:int main(int argc,char **argv) ; int main(int argc ,char *argv[ ] ); 这两种写法是一样的。二重指针等同于指针数组。
<2>不管是主函数还是功能函数,它都应该有一个返回值,而主函数的返回值是给调用的那个人的/main函数从某种角度来讲代表了我当前这个程序,或者说代表了整个程序。main函数的开始意味着整个程序开始执行,
main函数的结束返回意味着整个程序的结束。谁执行了这个程序,谁就调用了main。谁执行了程序?或者说程序有哪几种被调用执行的方法?一个程序当然会运行,那么就是调用了main( ).
<3>inux下一个新程序执行的本质
(1)表面来看,linux中在命令行中去./xx执行一个可执行程序
(2)我们还可以通过shell脚本来调用执行一个程序
(3)我们还可以在程序中去调用执行一个程序(fork exec)
总结:我们有多种方法都可以执行一个程序,但是本质上是相同的。linux中一个新程序的执行本质上是一个进程的创建、加载、运行、消亡。linux中执行一个程序其实就是创建一个新进程然后把这个程序丢进这个进程中去执行直到结束。
新进程是被谁开启?在linux中进程都是被它的父进程fork出来的。
分析:命令行本身就是一个进程,在命令行底下去./xx执行一个程序,其实这个新程序是作为命令行进程的一个字进程去执行的。
总之一句话:一个程序被它的父进程所调用。
结论:main函数返回给调用这个函数的父进程。父进程要这个返回值干嘛?父进程调用子进程来执行一个任务,然后字进程执行完后通过main函数的返回值返回给父进程一个答复。这个答复一般是表示子进程的任务执行结果完成了还是错误了。
(0表示执行成功,负数表示失败,正规的要求返回失败的原因,返回-1表示什么,返回-2又表示什么,然后父进程好做相应的处理)
(4) main函数的返回值应当是int 型。父进程要求是int型的,如果写成 float 型,则返回就为0,这样是要出错的。
8.5 用shell脚本来看main()的返回值。如:#!/bin/sh 其文本格式为 .sh
./a.out
echo $?
8.6、argc、argv与main函数的传参:当我们的父进程不需要传参时,就用 int main(void);当我们需要传参时,就应该是 int main(int argv ,char *argc[ ]);它默认本身就是一个参数,占了argv[0]这个位置,它里面存的是 ./a.out (这个相应变化)
如: ./a.out boy girl ;则 argv=3; argc[0]="./a.out"; argc[1]="boy"; argc[2]="girl" ; printf("%s\n",argc[0]);
解释:argv表示传了多少个参数,argc实质是存的一个指针,也就是一个地址,只是没有一个被绑定的变量名而已。这个地址指向一个字符串,一般字符串都和指针相关。所以可以称之为字符串数组,每一个都存了一个字符串。c++ strchr函数
在程序内部如果要使用argc,那么一定要先检验argv,先检验个数,然后使用。
8.7、void类型的本质:即使空型又是未知类型,看具体情况。比如一个函数void表示不返回, void *malloc(20);就是未知类型。
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-33816-15.html
你出名了
好看