int main(int argc, char *argv[])的解读

一、参数的含义

1、int argc:用来统计程序运行时发送给main函数的命令行参数的个数(在VS中默认值为1)。

2、char *argv[]:字符串数组,用来存放指向的字符串参数的指针数组,每个元素指向一个参数。

      argv[0]:指向程序运行的全路径名;

      argv[1]:指向在DOS命令行中执行程序名后的第一个字符串;

      argv[2]:指向执行程序名后的第二个字符串;

      argv[argc]:为NULL;

二、参数:char *argv[] 和参数:char **argv 的区别

 这两个参数都可以使用。

int main(int argc, char **argv)

1、char *argv[]

由于 [] 比 * 的运算等级高,所以argv是一个数组:argv[],然后它的元素类型为:char *;因此argv是一个元素为char * 型的数组。

2、char *s和char str[]的区别

C语言中没有真正的字符串类型,可以通过字符数组表示字符串,因为数组的元素地址是连续的。C语言中规定数组名代表数组所在内存中的首地址。也就是str[0]的地址。字符串常量的本质表示是一个地址。

s指针是char类型的,也可以保存字符串的地址(首地址),即第一个字符的地址,这个地址单元中的数据是一个字符,这也与s所指向的char一致。因此:s = a。

本质区别为:当定义char a[10]时,编译器会给数组分配十个单元内存,每个单元的数据类型为字符;而定义char *s 时,是个指针变量,只占四个字节,32位(或64位,根据系统的位数来定),用来保存一个地址。

C语言中操作字符串是通过它在内存中的存储单元的首地址进行的,这是字符串的终极本质。

3、char *argv[] 和 char **argv的区别

假设如下所示:

char **p = NULL;

char *argv[] = {"abcd", "aaaa", "bbbb", "cccc"};

p = argv;

p[0]和p[1]之间相差sizeof(p)个地址。是按照一个单位指针的长度进行累加的。由于数组argv元素地址也是按照单位指针长度累加的,因此可以通过p来进行访问argv元素。可以通过以下例子验证:

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

int main(int argc, char **argv)
{
    char **p = NULL;
    char *a[] = {"abcd", "aaaa", "bbbb", "cccc"};

    p = a;

    printf("%ld
", sizeof(p));
    printf("address: %p value: %s
", &p[0], p[0]);
    printf("address: %p value: %s
", &p[1], p[1]);
    printf("address: %p value: %s
", &a[0], a[0]);
    printf("address: %p value: %s
", &a[1], a[1]);
}
结果为:
ljs@ljs-PC:~/tcpip/10$ gcc wait.c -o wait
ljs@ljs-PC:~/tcpip/10$ ./wait
8
address: 0x7ffcbc32fb80 value: abcd
address: 0x7ffcbc32fb88 value: aaaa
address: 0x7ffcbc32fb80 value: abcd
address: 0x7ffcbc32fb88 value: aaaa
以上内容仅代表个人理解,如有不适之处,还望不吝赐教!
原文地址:https://www.cnblogs.com/wojiaowoen/p/8085570.html