| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 4264 人关注过本帖
标题:命令行函数理解问题(*++argv)[0] 和 *++argv[0] )
只看楼主 加入收藏
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
收藏
得分:0 
回复 10楼 九转星河
用函数指针调用函数,干嘛要解一次引用。
直接
p();

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

09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-05-13 09:52
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
回复 11楼 renkejun1942
这个啊~说错了勿喷啊~~

void(*)(int a,int b)表示指针函数~该指针函数指向带有两个int型变量的参数~
设void(*)(int a,int b)=A;
*Fun(A,int c)则是一个函数返回值的指针变量~

设Fun(A,int c)=B;

则可以简化成
void(*B)(int a,int b);

这个就不解释了~~~

用typedef对A B定义新变量类型则可以简化问题~~

不过Fun应该是一个实体函数~~在题目里面要加上返回值类型才算完整~~~
以前曾经在这块内容纠结了很久~

看过以前认为很变态的
(*(void (*)())0)();

0也能转化成void(*)();型~不过现在再理解就没啥难度了~

PS:刚写完分析问题就不见了??????~~~

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


[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-05-13 10:23
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
收藏
得分:0 
回复 12楼 九转星河
我觉得挺无聊的,所以就删掉了。
不过类似这个函数原型是真实存在的,并且可能以后你会经常用。

void ( *Fun( void (*)(int a, int b), int c ) )( int a, int b )

真实存在的函数原型是这样的
 void ( *S( void (*)(int), int a) )(int)




先从Fun开始解读。
fun接受两个参数,第一个参数为一个函数指针,第二参数为 int型。
Fun返回一个指针,这里 指针的类型暂时未知。
然后往外看,指针的类型是 void ( * )( int a, int b );

综合起来。 fun接受一个函数指针和一个int型参数,返回一个函数指针,返回的函数指针类型为 void (*)( int a, int b )。
用typedef化简的话是

typedef void ( *B)(int a, int b );
B fun( B, int c);

( *(()(*)())0)()
将0转换为函数指针,并调用。

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


09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-05-13 10:32
Emotiona
Rank: 7Rank: 7Rank: 7
等 级:黑侠
帖 子:311
专家分:581
注 册:2017-3-7
收藏
得分:0 
回复 9楼 renkejun1942
运算顺序都知道。
我想知道++(argv[0])是什么?
然后 *(++(argv[0]))又是什么?
你说单独一句 *++argv[0] == argv[0][0] 成立吗?
反正想了很多就是不理解*++argv[0]到底怎么进行运算的
2017-05-13 10:45
Emotiona
Rank: 7Rank: 7Rank: 7
等 级:黑侠
帖 子:311
专家分:581
注 册:2017-3-7
收藏
得分:0 
回复 8楼 wp231957
你说的很好理解。谢谢。我只想知道那一句怎么进行运算的。
2017-05-13 10:47
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
收藏
得分:0 
回复 14楼 Emotiona
不成立啊。avgr有过一次自增,所以应该是avgr[1][0].
在这里,还有一次自增,所以最终结果是avgr[1][1]

09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-05-13 10:47
Emotiona
Rank: 7Rank: 7Rank: 7
等 级:黑侠
帖 子:311
专家分:581
注 册:2017-3-7
收藏
得分:0 
回复 16楼 renkejun1942
图片附件: 游客没有浏览图片的权限,请 登录注册

*++argv[0];
测试了结果不一样,但是会输出YES。醉了。
结果:YES\ :

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

2017-05-13 10:57
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:0 
用%C输出。自己看一下
我在网吧。没法测试

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


DO IT YOURSELF !
2017-05-13 11:02
Emotiona
Rank: 7Rank: 7Rank: 7
等 级:黑侠
帖 子:311
专家分:581
注 册:2017-3-7
收藏
得分:0 
回复 18楼 wp231957
你又偷偷上网打游戏不学好
2017-05-13 11:04
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
收藏
得分:0 
回复 17楼 Emotiona

#include <stdio.h>

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

printf( "%c",*++argv[0] );
printf( "%c",argv[0][0] );

return 0;
}



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


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



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

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