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

#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.youkuaiyun.com/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.单独声明的时候是不一样的,一个是数组名,一个只是一个指针,你可以对一个指针++,但是对数组名却不行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值