| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 4405 人关注过本帖
标题:命令行函数理解问题(*++argv)[0] 和 *++argv[0] )
只看楼主 加入收藏
Emotiona
Rank: 7Rank: 7Rank: 7
等 级:黑侠
帖 子:311
专家分:581
注 册:2017-3-7
收藏
得分:0 
回复 25楼 renkejun1942
vs和codebloks都不会报警告。其实指针数组和指针的指针有相似之处,很多地方都能换用
2017-05-13 11:34
烟雨晨曦
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:7
帖 子:150
专家分:599
注 册:2017-3-5
收藏
得分:5 
回复 楼主 Emotiona
#include <stdio.h>
int main()
{
    char *argv[] = {"abc", "def"};
    //argv[0]->"abc";
    //argv[1]->"def";
    char* p = argv[0];
    printf("%c\n", *++p);
    printf("%c\n", *++argv[0]);
    return 0;
}
2017-05-13 11:36
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
收藏
得分:0 
回复 31楼 Emotiona
真的么?正因为你觉得可以换着用,所以你到现在还没理解那个表达式。

09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-05-13 11:37
Emotiona
Rank: 7Rank: 7Rank: 7
等 级:黑侠
帖 子:311
专家分:581
注 册:2017-3-7
收藏
得分:0 
回复 26楼 renkejun1942
26楼这些懂。不懂的是*++argv[0]  怎么获取到argv[1][1]  argv[1][2]
2017-05-13 11:38
烟雨晨曦
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:7
帖 子:150
专家分:599
注 册:2017-3-5
收藏
得分:0 
回复 34楼 Emotiona
#include <stdio.h>
int main()
{
    char *argv[] = {"abc", "def"};
    //argv[0]->"abc";
    //argv[1]->"def";
    char* p = argv[0];
    printf("%c\n", *++p);
    printf("%c\n", *++argv[0]);

    char argv1[3][3];
    char (*p1)[3] = argv1;
    //p1 == argv1[0];
    //++p1 == argv1[1]
}

[此贴子已经被作者于2017-5-13 11:57编辑过]

2017-05-13 11:54
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
收藏
得分:0 
回复 34楼 Emotiona
已知avgr自增一次,所以它存储的是第二的字符串的地址。(字符串字本身就是一个指针,因此要存储一个字符串的地址,变量的类型应该是 ** 指针的指针)
avgr[0]即,这个字符串的第一个元素的地址。使用下标,可以理解成对**进行了一次解引用,解引用的结果是 *
++avgr[0],该地址自增1,即,第二个元素的地址。
对其解引用。得到第二个元素的值。

再说一次,不要把main函数的avgr参数理解成指针数组。

*avgr[] 在编译时,同样会被编译器解释成 **argv。
而前者的写法,会产生错觉,以致于 argv[0],会让人以为 是 第0个字符串,既程序的名字。

[此贴子已经被作者于2017-5-13 12:33编辑过]


09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-05-13 11:59
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
收藏
得分:0 
*++argv[0] 等同于 *++*argv

马丹,太久不写这些程序,都忘记的差不多了,翻笔记翻的我欲仙欲死。

那段示例代码,写成这样就好理解了。

while( *++argv != NULL && **avgr == '-' )
    switch( *++*argv )

[此贴子已经被作者于2017-5-13 12:40编辑过]


09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-05-13 12:31
Emotiona
Rank: 7Rank: 7Rank: 7
等 级:黑侠
帖 子:311
专家分:581
注 册:2017-3-7
收藏
得分:0 
回复 37楼 renkejun1942
谢谢了,这么热心为我解答,现在很明白。我就是一股死脑筋,想argv[0]是程序名。没想过argv[0] == *argv   看来逆向思维很重要。  
2017-05-13 12:46
xzlxzlxzl
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:湖北
等 级:贵宾
威 望:125
帖 子:1091
专家分:5825
注 册:2014-5-3
收藏
得分:0 
我觉得举实例可能让题主更容易理解这个。
假如在cmd窗口下运行命令“d:\abc.exe abc cde efg”,相当于给程序abc.exe三个参数(所有参数都是字符串类型),系统会默认多给一个参数“d:\abc.exe”,所以此时argc=4,argv就是一个指针数组,里面存储了4个指针,argv[0]最开始指向的是“d:\abc.exe”里的字符“d”,++argv[0]后就指向“d:\abc.exe”里的第二个字符“:”,因此,用代码“for(;*(argv[0]);++argv[0])printf("%c",*argv[0]);”可以显示完整第一个字符串,下述代码可以比较好理解main函数里参数的用途:
程序代码:
#include <stdio.h>
#include <stdlib.h>
int main (int argc, char *argv[])
{
    int i;
    printf("argc=%d\n",argc);
    for(i=0;i<argc;i++)printf("%s\n",argv[i]);
    for(;*(argv[0]);++argv[0])printf("%c",*argv[0]);
    system("pause");
}

在cmd窗口执行“d:\abc.exe abc cde efg”命令后运行结果如下:
程序代码:
argc=4
d:\abc.exe
abc
cde
efg
d:\abc.exe请按任意键继续...
2017-05-13 12:58
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
回复 39楼 xzlxzlxzl
for(;*(argv[0]);++argv[0])printf("%c",*argv[0]);

// for(;**argv;++*argv)printf("%c",**argv);

这个程序输出argv[0]----argv[0]=*argv这样不是更容易理解么~不过这样就更改了argv的指向了~这样不方便重复利用~
看来输入时程序会自动补'\0'不然会把后面的数据都输出来了~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-05-13 13:12
快速回复:命令行函数理解问题(*++argv)[0] 和 *++argv[0] )
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.020449 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved