您的位置:首页 > 编程语言 > C语言/C++

由一题讨论C语言中的“指针数组作main函数的形参”即 main(int argc,char *argv[])的使用

2015-05-31 00:04 507 查看
#include<stdio.h>
#include<iostream.h>
main(int argc,char *argv[])
{
 int n=0,i;
 for(i=1;i<argc;i++)
 {
  n=n*10+*argv[i]-'0';
 }
 cout<<n<<endl;
}


编译连接后生成可执行文件tt.exe,若运行时输入一下命令行:
tt 12 345 678
程序执行后的输出结果是(?)
A 12    B 12345    C 12345678    D 136


答案是D:136

tt 12 345 678

tt.exe是程序的名字
后面带3个命令行参数(字符串类型的)

main()函数中的
argc是参数的个数(int类型),也就是3个(12 345 678)
argv是保存参数的二维字符数组
argv[0]指向程序路径: "tt.exe"
argv[1]指向第一个参数:"12"
argv[2]指向第二个参数:"345"
argv[3]指向第三个参数:"678"

显然
*argv[1] = '1'
*argv[2] = '3'
*argv[3] = '6'


程序的运行方法:首先都要编译、链接,生成“.exe”文件,注意此“.exe”文件一般会默认放到“Debug”文件夹中,需要在路径中有Debug,或先到Debug文件夹中取

方法一:

如果该程序名称为echo1.c,则编译、链接后会在Debug文件夹中生成“echo1.exe”文件,通过cd命令,进入echo1.exe所在的Debug文件夹,然后

echo1 12 345 678

就可以了



方法二:

另外,对于《C语言程序设计》谭浩强(第二版)中的"

如果有一个名为file1的文件,它包含以下的main函数:

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

{while(argc-->1)

printf("%s\n",*++argv);

}

在dos命令状态下输入的命令行为file1 china beijing

则执行以上命令将会输出以下信息:

china

beijing

"

关于这个程序的第三行printf("%s\n,*++argv)中的*++argv,argv是数组名,数组名代表数组的首地址,它怎么能够通过自加运算改变值呢?

理解如下:

参考:http://bbs.csdn.net/topics/190105480

其实
char
* agrv[] 实际上等于 
char
** agrv;


测试代码如下:

void   main()
{
	char   **argv = (char**)new char[100];
	argv[0] = "11";
	argv[1] = "22";
	argv[2] = "33";

  int   i;
  for(i=0;i <2;i++)
  {
	  printf( "%s\n ",*(++argv));
  }
}
可以参照以下理解:

char (*p)[3]; //这里是指针数组,指针p是指向含有3个元素的数组首地址
char *p[3];   //这里是数组指针,p[3]里面含有3个char*的指针


#include <stdio.h>

void main()

{char *argv[]={ "follow me ", "basic ", "computer design "};

int i;

for(i=0;i <2;i++)

printf( "%s\n ",*++argv);

}

这个程序运行时会出现以下两个错误:

Lvalue required in function main ‘argv’ is assigned a value which is never used

怎么解释呀??

解释:

argv 被声明为一个char*类型的数组

你这里做的操作就相当于直接++数组名,对一个左值进行改变,把char* 替换为char后相当于:

char ch[] = "dasdada";

ch++; // 这肯定是不行的

// 可以改成这样:

void main()

{ char *argv[]={ "follow me ", "basic ", "computer design "};

char **p = argv;

int i;

for(i=0;i <2;i++)

printf( "%s\n", *(p++));

}

谭浩强那个例子举的太烂,容易误解,把char *argv[]当参数传递时,编译器其实压栈的时候帮你做了

char **p = argv;

只不过p还用了原来的argv的名字,此时argv是栈中的一个变量,并强行转换为char **类型,所以可以做++操作。

其实char* agrv[] 实际上等于 char** agrv”

1.当参数传递的时候可以说他们等价,原因上面解释过。

2.单独声明的时候是不一样的,一个是数组名,一个只是一个指针,你可以对一个指针++,但是对数组名却不行。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: