| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 4403 人关注过本帖
标题:命令行函数理解问题(*++argv)[0] 和 *++argv[0] )
只看楼主 加入收藏
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
回复 13楼 renkejun1942
    void fun();
    void* p=fun;
    (*(void(*)())p)();

这样也可以实现指针函数的功能~虽然比较麻烦一些~不过感觉通用性较强~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-05-13 11:08
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
收藏
得分:0 
回复 21楼 九转星河
typeof( fun * ) p = fun;

09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-05-13 11:10
Emotiona
Rank: 7Rank: 7Rank: 7
等 级:黑侠
帖 子:311
专家分:581
注 册:2017-3-7
收藏
得分:0 
回复 21楼 九转星河
我草,你们还在讨论这个,帖子都要被你俩盖完了
2017-05-13 11:12
Emotiona
Rank: 7Rank: 7Rank: 7
等 级:黑侠
帖 子:311
专家分:581
注 册:2017-3-7
收藏
得分:0 
回复 16楼 renkejun1942
你再帮我解释下argv[1][1]怎么来的,转不过来了
(*++argv)[0] == *(argv[0] + 1)[0] == argv[1][0];
*++argv[0] == *(argv[0] + 1) == argv[1] == argv[1][0];

怎么得来argv[1][1] argv[1][2] 这个地方看了几个小时了。太浪费时间了。蛋疼  
2017-05-13 11:25
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
收藏
得分:0 
当时我做过笔记,所以我忘记了。
这些东西没什么好硬要理解的。示例代码只是示例,并不表示他的写法一定是好的。
理解他整个程序的思路就好了。

实际上在gcc上 *++argv[0] 会产生一个警告信息。
我忘记我当时用的什么编译器了,貌似没产生警告。

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


09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-05-13 11:27
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
收藏
得分:0 
main函数的第二个参数写成 **我觉得会更好,至少不会让人误以为,这是一个指针数组。

++agvr 的结果 是 argv中存储的值,自增 n 个字节。

*++argv 从上面的结果得出 此时 它指向 argv存储的地址。

(*++argv)[0],已知 *++argv指向一个字符串,【0】,则为该字符串的0号元素。

[此贴子已经被作者于2017-5-13 11: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:30
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
以下是引用renkejun1942在2017-5-13 09:52:22的发言:

用函数指针调用函数,干嘛要解一次引用。
直接
p();

看到书上的要求,都是要求写成(*p)(),我觉得很多余。
纯粹是在给编译器找事儿做。

void* p=fun;
不过这样引用(void(*)())p();会报错~

void (*p)()=fun;

p();
和(*p)();还是有区别的~
p和*p的地址级别不同~值也不同~


void fun();
void (*p)()=fun;
printf("%d %d %d %d %d %d\n",(int*)p,*(int*)p,(int*)p+1,*(int*)p+1,**(int**)p,**(int**)p+1);

前者增值为4后者增值为1~

void (*p)()=fun;
p();
这样符合常理~
课本这样写(*p)();猜测是为了强调调用的是指针函数吧~~~

顺便运行一下最后两个是怎么回事~看来函数地址这东东不是这么好弄啊~~



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


[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-05-13 11:31
Emotiona
Rank: 7Rank: 7Rank: 7
等 级:黑侠
帖 子:311
专家分:581
注 册:2017-3-7
收藏
得分:0 
回复 25楼 renkejun1942
我日哦。昨天晚上到今天上午就在理解这行代码,还输没搞清楚。虽说是个实例代码,但是理解了的话,指针就又掌握了一点。学c本来指针就很重要的。你再看看能不能想出来是咋回事。现在我脑袋已经成豆腐渣了
2017-05-13 11:31
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:0 
6楼的代码难道不能解决问题吗

虽然数组和指针关系密切。但是这里无论你想取参数。还是想取参数中的某个字符(虽然着没有意义)
这都和二维数组没啥关系。为啥非要纠结于此

DO IT YOURSELF !
2017-05-13 11:34
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
收藏
得分:0 
回复 28楼 Emotiona
看26楼,给你分析过程了。

09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-05-13 11:34
快速回复:命令行函数理解问题(*++argv)[0] 和 *++argv[0] )
数据加载中...
 
   



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

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