为什么这两个地址是一样的?

孤独的潜行者 2012-10-25 03:02:22

#include <stdio.h>

typedef void (callback_t)(void *);
// typedef void (*callback_t)(void *); // 这两个回调函数定义有什么区别


void repeat(callback_t f, void *para) {
f(para);
f(para);
f(para);
}

void say_hello(void *str) {
printf("Hello %s\n", (char *)str);
}

int main() {
char a[] = "aaaaaaaaaa";
printf("%p %p\n", a, &a);

callback_t *p = say_hello;
repeat(say_hello, "Guys");
repeat(&say_hello, "&&&&Guys");
printf("%p %p\n", say_hello, &say_hello);
repeat(p , "ppppGuys");
return 0;
}
/**
0xbfa3fb71 0xbfa3fb71
Hello Guys
Hello Guys
Hello Guys
Hello &&&&Guys
Hello &&&&Guys
Hello &&&&Guys
0x804845d 0x804845d
Hello ppppGuys
Hello ppppGuys
Hello ppppGuys
*///


a 跟 &a ,
say_hello 跟 &say_hello
地址为什么一样的?
还有:
typedef void (callback_t)(void *);
typedef void (*callback_t)(void *); // 这两个回调函数定义有什么区别
...全文
168 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
hust_terry 2012-10-25
  • 打赏
  • 举报
回复
1楼正解
孤独的潜行者 2012-10-25
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

当一个标示已经是地址了,那么你再加1000个&&&&&&还是它的地址。
[/Quote]
&&a 编译出错
shen_wei 2012-10-25
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]
引用楼主 的回复:
a 跟 &a ,
say_hello 跟 &say_hello
地址为什么一样的?
还有:
typedef void (callback_t)(void *);
typedef void (*callback_t)(void *); // 这两个回调函数定义有什么区别

1,
char* = a; //数组到指针转换,标准转换之一
a 和 &……
[/Quote]

++ 详细。。
AndyZhang 2012-10-25
  • 打赏
  • 举报
回复
当一个标示已经是地址了,那么你再加1000个&&&&&&还是它的地址。
mujiok2003 2012-10-25
  • 打赏
  • 举报
回复
[Quote=引用楼主 的回复:]
a 跟 &a ,
say_hello 跟 &say_hello
地址为什么一样的?
还有:
typedef void (callback_t)(void *);
typedef void (*callback_t)(void *); // 这两个回调函数定义有什么区别
[/Quote]
1,
char* = a; //数组到指针转换,标准转换之一
a 和 &a 值相同,但是意义不同

2,
say_hello在出了函数调用中外,会发生函数到函数指针的转换,也属于表准转换之一。

3, 形式不一样,用法稍有区别

typedef void (cb_t)(void *);
typedef void (*pcb)(void *);

"cb_t* p;" 和 "pcb p;" 等价


69,381

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧