完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
在邮箱的官方例程中 rt_mb_send(&mb, (rt_uint32_t)&mb_str1); 这两句中的的(rt_uint32_t)&mb_str1与rt_uint32_t *)&str怎么理解呢? 我的理解是(rt_uint32_t)&mb_str1是取mb_str1地址然后强制转化成整数,(rt_uint32_t *)&str是指针str的指针 但是如果(rt_uint32_t *)&str是指针str的指针,那么他应该是一个值,这个值是个指向str指针的地址,而rt_mb_recv();函数那个位置应该放的是是个缓冲区啊而不是一个值啊 |
|
相关推荐
5个回答
|
|
数组名 和 &数组名 虽然在数值上相同,但是在类型上不同。 数组名 是指向首个元素的指针, &数组名 是指向整个数组的指针。 在指针加减整数的时候,前者以一个元素为颗粒度,后者以整个数组为颗粒度。 |
|
|
|
感谢您对(rt_uint32_t)&mb_str1的解释,解释的非常清晰。
对于下面的程序怎么理解呢? char* str; rt_mb_recv(&mb, (rt_uint32_t *)&str, RT_WAITING_FOREVER); (rt_uint32_t *)&str是指向指针str的指针吗,是指向指针str的一个地址值吗?(以上代码是官方在文档里关于邮箱的一个例程,对于指针这块不是很理解,如果答主能结合例程解答感激不尽) |
|
|
|
这个是传参的问题,因为定义的是一个指针 char *str;,在 rt_mb_recv() 中如果想改变指针的指向,就需要传递一个二级指针。
先举一个一级指针的例子给你看一下 #include void swap_1(int num1, int num2) { int temp; temp = num1; num1 = num2; num2 = temp; } void swap_2(int *p1, int * p2) { int temp; temp = *p1; *p1 = *p2; *p2 = temp; } int main(int argc, const char *argv[]) { int a = 3, b = 5; swap_1(a, b); // 没有交换 printf("a = %d, b = %dn", a, b); swap_2(&a, &b); // 交换了 printf("a = %d, b = %dn", a, b); return 0; } /* * result: * a = 3, b = 5 * a = 5, b = 3 */ |
|
|
|
再举一个二级指针的例子(示例,内存申请未释放,只是演示用)
官方例子中因为要把 str 指向邮箱中的一块内存,所以要传递二级指针,可以看到源码中有这样一行代码 *value = mb->msg_pool[mb->out_offset]; #include #include void test_1(char *p) { p = malloc(16); printf("func: %s, line = %d, p = %pn", __FUNCTION__, __LINE__, p); } void test_2(char **p) { *p = malloc(16); printf("func: %s, line = %d, p = %pn", __FUNCTION__, __LINE__, *p); } int main(int argc, const char *argv[]) { char *p1 = NULL; char *p2 = NULL; test_1(p1); printf("func: %s, line = %d, p = %pnn", __FUNCTION__, __LINE__, p1); test_2(&p2); printf("func: %s, line = %d, p = %pn", __FUNCTION__, __LINE__, p2); return 0; } /* * result: * func: test_1, line = 8, p = 0x558c2be0f260 * func: main, line = 24, p = (nil) * * func: test_2, line = 15, p = 0x558c2be0f690 * func: main, line = 27, p = 0x558c2be0f690 */ |
|
|
|
可以网上找一些二级指针的讲解看一下。
另外我觉得示例中的发送部分,带不带 & 都是不影响的,因为 数组名 和 &数组名 数值上是一样的,在这里是没有区别的 if (count & 0x1) { /* 发送 mb_str1 地址到邮箱中 */ rt_mb_send(&mb, (rt_uint32_t)&mb_str1); } else { /* 发送 mb_str2 地址到邮箱中 */ rt_mb_send(&mb, (rt_uint32_t)&mb_str2); } |
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
802 浏览 0 评论
5053 浏览 0 评论
如何使用python调起UDE STK5.2进行下载自动化下载呢?
2650 浏览 0 评论
开启全新AI时代 智能嵌入式系统快速发展——“第六届国产嵌入式操作系统技术与产业发展论坛”圆满结束
2990 浏览 0 评论
获奖公布!2024 RT-Thread全球巡回线下培训火热来袭!报名提问有奖!
32051 浏览 11 评论
73166 浏览 21 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-26 19:17 , Processed in 0.879698 second(s), Total 79, Slave 61 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号