*++*argv . **argv * .*++argv这iwatch三个版本的区别区别

c/c++&main(int&argc,char&**argv)
main(int argc,char **argv)
&& argv为指针的指针
&& argc为整数
&& char **argv
or: char *argv[ ]
or: char argv[ ][ ]
main()括号内是固定的写法。
下面给出一个例子来理解这两个参数的用法:
假设程序的名称为prog,
<span STYLE="CoLor: #.当只输入prog,则由操作系统传来的参数为:
&& argc=<span STYLE="CoLor: #,表示只有一程序名称。
argc只有一个元素,argv[<span STYLE="CoLor: #]指向输入的程序路径及名称:./prog
<span STYLE="CoLor: #.当输入prog para_1,有一个参数,则由操作系统传来的参数为:
&& argc=<span STYLE="CoLor: #,表示除了程序名外还有一个参数。
&& argv[<span STYLE="CoLor: #]指向输入的程序路径及名称。
&& argv[<span STYLE="CoLor: #]指向参数para_1字符串。
<span STYLE="CoLor: #.当输入prog para_1 para_2 有2个参数,则由操作系统传来的参数为:
&& argc=<span STYLE="CoLor: #,表示除了程序名外还有2个参数。
&& argv[<span STYLE="CoLor: #]指向输入的程序路径及名称。
&& argv[<span STYLE="CoLor: #]指向参数para_1字符串。
&& argv[<span STYLE="CoLor: #]指向参数para_2字符串。
&& char&&&
*argv[]&&&
argv是一个指针数组,他的元素个数是argc,存放的是指向每一个参数的指针,他的第一个元素即argv[<span STYLE="CoLor: #]为编译生成的可执行文件名(包括路径eg:"F:\VC\Ex1\Debug\Ex1.exe"),从二个元素(argv[<span STYLE="CoLor: #])开始,是每一个参数&
表示argv的大小,是实际参数个数+<span STYLE="CoLor: #,其中+1是因为argv[<span STYLE="CoLor: #]是编译后的可执行文件名
main()主函数
每一C 程序都必须有一main()函数, 可以根据自己的爱好把它放在程序的某
个地方。有些程序员把它放在最前面, 而另一些程序员把它放在最后面, 无论放
在哪个地方, 以下几点说明都是适合的。
<span STYLE="CoLor: #.
main() 参数
在Turbo C2.0启动过程中, 传递main()函数三个参数: argc, argv和env。
* argc:&& 整数,
为传给main()的命令行参数个数。
字符串数组。
&&&&&&&&&&&&&&
在DOS <span STYLE="CoLor: #.X 版本中, argv[<span STYLE="CoLor: #] 为程序运行的全路径名;
对DOS <span STYLE="CoLor: #.0
&&&&&&&&&&&&&&
以下的版本, argv[<span STYLE="CoLor: #]为空串("")
&&&&&&&&&&&&&&
argv[<span STYLE="CoLor: #] 为在DOS命令行中执行程序名后的第一个字符串;
&&&&&&&&&&&&&&
argv[<span STYLE="CoLor: #] 为执行程序名后的第二个字符串;
&&&&&&&&&&&&&&
&&&&&&&&&&&&&&
argv[argc]为NULL。
字符串数组。env[] 的每一个元素都包含ENVVAR=value形式的字符
串。其中ENVVAR为环境变量如PATH或87。value 为ENVVAR的对应值如C:\DOS, C:
\TURBOC(对于PATH) 或YES(对于87)。
Turbo C2.0启动时总是把这三个参数传递给main()函数, 可以在用户程序中
说明(或不说明)它们, 如果说明了部分(或全部)参数, 它们就成为main()子程序
的局部变量。
请注意: 一旦想说明这些参数, 则必须按argc, argv, env 的顺序, 如以下
main(int argc)
main(int argc, char *argv[])
main(int argc, char *argv[], char *env[])
其中第二种情况是合法的, 但不常见, 因为在程序中很少有只用argc, 而不
用argv[]的情况。
以下提供一样例程序EXAMPLE.EXE,&&
演示如何在main()函数中使用三个参数:
#i nclude &stdio.h&
#i nclude &stdlib.h&
main(int argc, char *argv[], char *env[])
&&&&&&&&&&
&&&&&&&&&&
printf("These are the
%d&& command-
line&& arguments
passed&& to &&&&&&&&&&&&&&&&&&
main:\n\n", argc); &&&&&&&&&&
for(i=<span STYLE="CoLor: #;
&&&&&&&&&&&&
printf("argv[%d]:%s\n", i,
&&&&&&&&&&
printf("\nThe environment string(s)on this system
are:\n\n");
&&&&&&&&&&
for(i=<span STYLE="CoLor: #;
env[i]!=NULL; i++)
&&&&&&&&&&&&&&&
printf(" env[%d]:%s\n", i,
如果在DOS 提示符下, 按以下方式运行EXAMPLE.EXE:
C:\example first_argument "argument with
<span STYLE="CoLor: #&&
<span STYLE="CoLor: #&&
stop! &&&&
注意: 可以用双引号括起内含空格的参数,
如本例中的:&&&
with blanks"和"Last but
结果是这样的:
The value of argc is
<span STYLE="CoLor: #
These are the <span STYLE="CoLor: #
command-linearguments
passed to main:
argv[<span STYLE="CoLor: #]:C:\TURBO\EXAMPLE.EXE
argv[<span STYLE="CoLor: #]:first_argument
argv[<span STYLE="CoLor: #]:argument with blanks
argv[<span STYLE="CoLor: #]:<span STYLE="CoLor: #
argv[<span STYLE="CoLor: #]:<span STYLE="CoLor: #
argv[<span STYLE="CoLor: #]:last but one
argv[<span STYLE="CoLor: #]:stop!
argv[<span STYLE="CoLor: #]:(NULL)
The environment string(s)
on this system are:
env[<span STYLE="CoLor: #]: COMSPEC=C:\
env[<span STYLE="CoLor: #]: PROMPT=$P$G&&&&&&&&&&&&
env[<span STYLE="CoLor: #]: PATH=C:\DOS;C:\TC&&&&&&
应该提醒的是: 传送main() 函数的命令行参数的最大长度为128 个字符 (包
括参数间的空格),&& 这是由DOS
main函数之前--真正的函数执行入口或开始
实际上,在可执行文件被加载之后,控制权立即交给由编译器插入的Start函数,它将对后面这些全局变量进行准备:
   _osver 操作系统的构件编号
&_winmajor 操作系统的主版本号
&_winminor 操作系统的次版本号
&_winver 操作系统完全版本号
&__argc 命令行参数个数
 & & __argv 指向参数字符串的指针数组
&_environ 指向环境变量字符串的指针数组
Start函数初始化堆并调用main函数.mian函数返回之后,Start函数调用Exit函数结束该进程.
启动函数Start的源代码在:
   crt0.c Microsoft Visual C++
&c0w.asm Borladn C++
另一种解释
Some of the stuff that has to happen before
set up initial stack pointer
initialize static and global data
zero out uninitialized data
run global constructors
Some of this comes with the runtime library's crt0.o file or its
__start() function. Some of it you need to do yourself.
Crt0 is a synonym for the C runtime library.
Depending on the system you're using the follwing may be
incomplete, but it should give you an idea. Using
newlib-1.9.0/libgloss/m68k/crt0.S as an outline, the steps
1. Set stack pointer to value of __STACK if set
2. Set the initial value of the frame pointer
3. Clear .bss (where all the values that start at zero go)
4. Call indirect of hardware_init_hook if set to initialize
5. Call indirect of software_init_hook if set to initialize
6. Add __do_global_dtors and __FINI_SECTION__ to the atexit
function so destructors and other cleanup functions are called when
the program exits by either returning from main, or calling
7. setup the paramters for argc, argv, argp and call main
8. call exit if main returns
第三种解释:囫囵C语言(三):谁调用了我的 main?
    现在最重要的是要跟得上潮流,所以套用比较时髦的话,谁动了我的奶酪。谁调用了我的
main?不过作为计算机工作者,我劝大家还是不要赶时髦,今天Java热,明天 .net
流行,什么时髦就学什么。我的意思是先花几年把基本功学好,等你赶时髦的时候也好事半功倍。废话不多说了。
    我们都听说过一句话:“main是C语言的入口”。我至今不明白为什么这么说。就好像如果有人说:“挣钱是泡妞”,肯定无数砖头拍过来。这句话应该是“挣钱是泡妞的一个条件,只不过这个条件特别重要”。那么上面那句话应该是
“main是C语言中一个符号,只不过这个符号比较特别。”
    我们看下面的例子:
    int main(int argc, char* argv)
     return 0;
    编译链接它:
    cc test00.c -o test.exe
    会生成 test.exe
    但是我们加上这个选项: -nostdlib (不链接标准库)
    cc test00.c -nostdlib -o test.exe
    链接器会报错:
    undefined symbol: __start
    也就是说:
    1. 编译器缺省是找 __start 符号,而不是 main
    2. __start 这个符号是程序的起始点
    3. main 是被标准库调用的一个符号
    再来思考一个问题:
    我们写程序,比如一个模块,通常要有 initialize 和 de-initialize,但是我们写 C
程序的时候为什么有些模块没有这两个过程么呢?比如我们程序从 main 开始就可以 malloc,free,但是我们在 main
里面却没有初始化堆。再比如在 main 里面可以直接 printf,可是我们并没有打开标准输出文件啊。(不知道什么是
stdin,stdout,stderr 以及 printf 和 stdout 关系的群众请先看看 C 语言中文件的概念)。
    有人说,这些东西不需要初始化。如果您真得这么想,请您不要再往下看了,我个人认为计算机软件不适合您。
    聪明的人民群众会想,一定是在 main
之前干了些什么。使这些函数可以直接调用而不用初始化。通常,我们会在编译器的环境中找到一个名字类似于 crt0.o
的文件,这个文件中包含了我们刚才所说的 __start 符号。(crt 大概是 C Runtime
的缩写,请大家帮助确认一下。)
    那么真正的 crt0.s 是什么样子呢?下面我们给出部分伪代码:
    ///////////////////////////////////////////////////////
    section .text:
    __start:
     :
     :
     call _ (调用 main)
     :
     :
     call __
    ////////////////////////////////////////////////////
    实际上可能还有很多初始化工作,因为都是和操作系统相关的,笔者就不一一列出了。
    注意:
    1. 不同的编译器,不一定缺省得符号都是 __start。
    2. 汇编里面的 _main 就是 C 语言里面的
main,是因为汇编器和C编译器对符号的命名有差异(通常是差一个下划线'_')。
    3.
目前操作系统结构有两个主要的分支:微内核和宏内核。微内核的优点是,结构清晰,简单,内核组件较少,便于维护;缺点是,进程间通信较多,程序频繁进出内核,效率较低。宏内核正好相反。我说这个是什么目的是:没办法保证每个组件都在用户空间(标准库函数)中初始化,有些组件确实可能不要初始化,操作系统在创建进程的时候在内核空间做的。这依赖于操作系统的具体实现,比如堆,宏内核结构可能在内核初始化,微内核结构在用户空间;即使同样是微内核,这个东东也可能会被拿到内核空间初始化。
    随着 CPU 技术的发展,存储量的迅速扩展,代码复杂程度的增加,微内核被越来越多的采用。你会为了 10%
的效率使代码复杂度增加么?要知道每隔 18 个月 CPU
的速度就会翻一番。所以我对程序员的要求是,我首先不要你的代码效率高,我首先要你的代码能让 80% 的人迅速看懂并可以维护。
main函数执行之前,主要就是初始化系统相关资源:
1.设置栈指针
2.初始化static静态和global全局变量,即data段的内容
3.将未初始化部分的赋初值:数值型short,int,long等为0,bool为FALSE,指针为NULL,等等,即.bss段的内容
4.运行全局构造器,估计是C++中构造函数之类的吧
5.将main函数的参数,argc,argv等传递给main函数,然后才真正运行main函数
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。怎么理解int main(int argc,char **argv)_百度知道
怎么理解int main(int argc,char **argv)
比如我输入 ; 1 || led_no &lt: 字符串;,char **argv)中 argv[1]是一个指针,char *argv)  
}其中sscanf(argv[1],&on) , char **argv){
int on,每一个元素指向一个参数  argv[1] 指向在DOS命令行中执行程序名后的第一个字符串的指针  argv[2] 指向执行程序名后的第二个字符串的指针
在int main(0 || led_no&gt,char **argv)区别;%d&Usage!不知道我理解的对不对,而在int main(int argc,用来统计你运行程序时送给的命令行参数的个数  *),&led_no) ;
if(argc ,存的内容是一个地址!=1不是很明白!= 3 ||sscanf(argv[1],如下;
int fd,char **argv) 相当于
int main(int argc!希望看到这篇文章的高手,char *argv)与int main(int argc.&#47,所以led_on就是argv[1]地址中的内容,利用sscanf 把1的地址传给你&led_on
从而得出 led_on为1 我理解对吗,用来存放指向你的字符串参数的,用来存放指向你的字符串参数的,用来统计你运行程序时送给的命令行参数的个数  * argv!=1 ||
on &lt,每一个元素指向一个参数  argv[0] 指向程序运行的全路径名  argv[1] 指向在DOS命令行中执行程序名后的第一个字符串  argv[2] 指向执行程序名后的第二个字符串int main(int argc,char *argv[ ] )
argc,&quot: 整数;
int led_3)
fprintf(!=1 ||
sscanf(argv[2],&quot,把这个地址通过sscanf函数传递给&led_on!我的理解是这样的,&quot:argv[1]中存的是一个地址;led 1 0
那么argv[1]就是指向1的指针,char
*argv)中argv[1]是一个数组元素(个人理解)2: 字符串:
int main(int argc: 整数?int main(int argc,给指点一下:Leds led_no 0|1&#92,&led_no) ;%d&quot,&%d&n&quot1、我看到这样的一个程序;; 0 || on &gt、int main(int argc
sscanf(argv[1],&led_no)最后的&地址符号怎么理解;%d&quot,&quot
提问者采纳
%d&quot, char **argv)是正确的方式!1,你首先要弄明白一个问题, 他们都是字符串, &quot,那么就把它读入led_hello world&quot,&quot!:int main(int argc:sscanf不同于scanf的地方是 sscanf从一个字符串中得到输入,首先矫正一下, 反之你也可以用char*去存取字符串。 当你在终端打入 Leds led_no 0
时!4。3,argv[0]就是Leds, 现在char **argv 就好理解了,它就是一个指向字符串的指针, 而scanf是你从终端输入; 如果你熟悉数组与指针的关系,或者是书上笔误, argv[2]就是 0,那么这里的argv[n]也容易理解,sscanf(argv[1]。而int main(int argc,&led_no) !=1 这一句。2唉要喂?,如果argv [1]这个字符串中含数字?那是不正确的,不要被它愚弄了;。 这句就是; 这个字符 常量 的返回值是什么!!
一个字符串常量的返回值是char*,argv[1]就是led_no. 并返回1, char *argv)你从哪里看来的
提问者评价
非常感谢,我明白了!很感谢,这么认真地回答!
其他类似问题
为您推荐:
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁main( int argc ,char*argv[ ] ) {int n,i=0 ; while(argv[ 1 ][ i ]! =&#39;&#92;0&#39; ) {n=fun();i++;}_百度知道
main( int argc ,char*argv[ ] ) {int n,i=0 ; while(argv[ 1 ][ i ]! =&#39;&#92;0&#39; ) {n=fun();i++;}
n&i++; ){n=fun();,i=0 ;&#92;}int fun(){static int s=0main( int argc ! =&#39;return s.0&#39,n*arge);}printf(%d&#92,为什么; ,结果为6;s+=1;}假设程序经编译连接生成可执行文件exam,若输入exam 123&回车&gt,char*argv[ ] ){while(argv[ 1 ][ i ]
提问者采纳
因为字符串“123”长度为3,结果应该是6;printf(%d&#92;n&回车&后,参数argc = 2,输入exam 123&123&中的arge是argc吗。若exam后没有参数,则argc = 1,argv[0] =,n*arge),所以argc * n 等于2 * 3 等于6?如果是的话,argv[1] = &quot
参数argc = 2,argv[1] = &123&.
这一步是为什么?还有最后S是怎么运算出的?
argc和argv是由系统传递的,argc始终大于或等于1,当exam后无有参数时,argc等于1,有n个参数,argc为n+1,第一个字符串的地址存在argv[1],第二个字符串的地址存在argv[2],依此累推。s你定义为static静态变量,具有连续性,所以执行一次fun()时,s就累加1,总共执行了3次,所以while循环退出时,s的值为3,n的值也为3一时大意,之前的回答中argv[0] = main;是错的,应该是argv[0] 指向程序运行的全路径名
提问者评价
其他类似问题
其他2条回答
i为2因为 s是静态变量 s只有在主程序结束后s的内存才会释放,所以s的值是每次累加的结果 输入123输入了三个字符 那么fun()函数被调用了三次。则s的值为3,而arge就是i值,则n的值为3,输入1时i为0,i为1,输入3时。arge=2,输入2时
局部静态变量的值只能够被初始化一次,并且生命周期是和整个程序一样的,也就是说s在被第一次初始化0后,以后每调用一次函数fun,s都自增1,并且不再被另外初始化。所以最后s的值为3也就是n值为3,如果程序中的arge没有错的话,程序是编译不通过的,如果是argc的话,就没有问题了,因为你在命令提示行里面,输入了两个字符串,一个是exam, 另外一个是123所以argv[0]=&exam&,argv[1]=&123&,而参数argc所接收的是参数的个数,也就是2,所以最终结果n*argc=3*2=6
为您推荐:
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁*++*argv和++**argv有什么不同_百度知道
*++*argv和++**argv有什么不同
*++*argv和++**argv有什么不同
提问者采纳
那么,及指向地址 (X+1)的内存上的值, 的值是 *(X+1),即*x +1;++**argv,*argv就指向了这个地址上的值,假使argv存了一个地址:)*++*argv,内存x所指向的值+1* 解引用。(假使这个值是X
提问者评价
其他类似问题
按默认排序
其他1条回答
*(++(*argv))
等同 ++(*(*argv))
为您推荐:
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁

我要回帖

更多关于 华为p8三个版本的区别 的文章

 

随机推荐