将数组传递给函数,是否需要使用&
?
在下面的案例1或案例2中,哪一个好?
#define IP_ADDR_LEN 4
char ip[4]={192,168,205,1};
char PeerIP[4];
int main()
{
memcpy(PeerIP,ip,IP_ADDR_LEN)
testip(PeerIP); /* Case 1 */
testip(&PeerIP); /*Case 2*/
}
int testip(char *ip)
{
/* IP check */
}
答案 0 :(得分:2)
第一个。
testip(PeerIP);
是正确的方法,因为数组名称将衰减为指向数组的第一个元素的指针,该指针与被调用函数参数的预期类型匹配。
详细说明,在您的代码中,testip()
需要char *
类型的参数,并通过调用它testip(PeerIP);
来传递char *
,所以没有问题。< / p>
如果你使用&PeerIP
,类型将是[char (*) [4]
]指向数组的指针,不是指向数组第一个元素的指针[{{1}它们是不同的类型。
引用char *
,章节§6.3.2.1,左值,数组和函数指示符,(强调我的)
除非
C11
运算符,sizeof
运算符或运算符 一元_Alignof
运算符,或者是用于初始化数组的字符串文字,一个表达式 type ''类型''的数组被转换为类型''指向类型''指针的表达式 到数组对象的初始元素,而不是左值。 [...]