由一题讨论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.单独声明的时候是不一样的,一个是数组名,一个只是一个指针,你可以对一个指针++,但是对数组名却不行。
相关文章推荐
- C语言产生随机数
- Unix C语言编程示例
- C/C++&nbsp;函数指针,强制转换示例
- 一个简单的C/C++多线程
- C/C++求完数,小提醒
- C++ 实现杨辉三角
- C/C++用Unicode保存字符并输出
- C/C++素数判断(附exe方便不懂编程…
- C++刷题——线段分割平面
- 渣校ACM历程——番外之蓝桥杯决赛
- 【末世旅行之C语言】C语言经典试题小集合
- Error Tips
- 在C++里写一个不能被继承的类
- 汉诺塔的C语言实现
- ubuntu下c语言hello world
- swust oj 1132--Coin-collecting by robot
- swust oj 1139--Coin-row problem
- C++虚函数及虚函数表解析
- 高效编程——C++测试代码运行时间方法
- hdoj1160最长上升子序列