免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4875 | 回复: 7
打印 上一主题 下一主题

[C] 将双指针作为实参传递给指针形参怎么样? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-01-13 18:33 |只看该作者 |倒序浏览
本帖最后由 solitrarychen 于 2014-01-13 18:36 编辑

在读代码的时候遇到了一段程序,理解不了,还请大家解答一下。
  1. //参数和函数定义
  2. char ipv6Address[44]={0};
  3. void rutlan_getIpv6Address(const char * bridgeName, char * ipv6Addr){
  4. ....
  5. sprintf(ipv6Addr,%s, "fe80::");//示意,主要是这样一个操作。
  6. ....
  7. }

  8. //调用函数
  9. char *brName="br0"
  10. rutlan_getIPv6Address(brName, & ipv6Address);
复制代码
大家看这样可行吗?我看不懂,对数char型数组名取地址这一步操作了,数组名不就是数组的第一元素的地址么,再取一次地址,好像成了双指针了。可以吗?
函数最终又会通过这个指针返回什么哪?不解。

论坛徽章:
17
处女座
日期:2013-08-27 09:59:352015亚冠之柏太阳神
日期:2015-07-30 10:16:402015亚冠之萨济拖拉机
日期:2015-07-29 18:58:182015年亚洲杯之巴勒斯坦
日期:2015-03-06 17:38:17摩羯座
日期:2014-12-11 21:31:34戌狗
日期:2014-07-20 20:57:32子鼠
日期:2014-05-15 16:25:21亥猪
日期:2014-02-11 17:32:05丑牛
日期:2014-01-20 15:45:51丑牛
日期:2013-10-22 11:12:56双子座
日期:2013-10-18 16:28:17白羊座
日期:2013-10-18 10:50:45
2 [报告]
发表于 2014-01-13 21:57 |只看该作者
回复 1# solitrarychen

假如有以下变量:
  1. int data[10];
  2. int* p = data;
复制代码
这是数组是一个比较微妙的问题,数组名字在访问时实际上进行了隐式转换,以常视为相等的数组名和指针使用为例,在例了中p=data是合法的,而p = &data[0]的效果是一样的,进一步来讲p = &data[0]和p = data是等价的。再进一步&data[0]和&data+0也是等价的,所以&data和%data[0]是等价的,针对数组来讲其地址写&data和data,&data[0]都可以。因为数组名字代表的就是首元素的地址所以造就了这个问题,一定要注意&data[1]和&data+1就不再等价了。因为数组是有类型的,&data+1相当于&data+10*sizeof(int)。

论坛徽章:
0
3 [报告]
发表于 2014-01-14 08:52 |只看该作者
回复 2# myworkstation
真是感谢,回答的很详细,解答了我的疑惑。指针和地址真是一个微妙的东西,看来我还有很多需要学习的地方。

   

论坛徽章:
0
4 [报告]
发表于 2014-01-15 16:29 |只看该作者
不得不说,这样的实参很拙劣。
ISO/IEC 9899:201x
6.3.2.3 Pointers
7 A pointer to an object type may be converted to a pointer to a different object type. If the
resulting pointer is not correctly aligned6 for the referenced type, the behavior is
undefined. Otherwise, when converted back again, the result shall compare equal to the
original pointer. When a pointer to an object is converted to a pointer to a character type,
the result points to the lowest addressed byte of the object. Successive increments of the
result, up to the size of the object, yield pointers to the remaining bytes of the object.

论坛徽章:
0
5 [报告]
发表于 2014-01-15 18:49 |只看该作者
回复 4# automation_mb
亲还真没看懂,引用的这段ISO标准的意思。


   

论坛徽章:
0
6 [报告]
发表于 2014-01-15 18:55 |只看该作者
回复 4# automation_mb
你引用的标准好像在说指针类型的转换,和我提到的问题似乎没有关系啊。


   

论坛徽章:
0
7 [报告]
发表于 2014-01-16 15:52 |只看该作者
将 char(*)[44] 赋值给 char *

论坛徽章:
0
8 [报告]
发表于 2014-01-17 15:06 |只看该作者
回复 7# automation_mb
很有道理,这样很好,本来数组名作为指针形参传递到函数内部时,会退化为指针,就不知道数组边界的大小了。
如果这种方法可以实现传递 char (*)[44]的话,就可以在函数内部知道到数组的大小了。
但是你可以详细的讲一些么?比如有没有什么资料啊,博客阐述这一种用法的。


   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP