将char数组传递给函数

将char数组传递给函数,c,arrays,pointers,parameter-passing,function-call,C,Arrays,Pointers,Parameter Passing,Function Call,将数组传递给函数时,它是否需要使用& 在下面的示例案例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

将数组传递给函数时,它是否需要使用
&

在下面的示例案例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 */

}
第一个

  testip(PeerIP);
是正确的方法,因为数组名称将衰减为指向数组第一个元素的指针,该元素与被调用函数参数的预期类型匹配

要详细说明,在代码中,
testip()
需要一个
char*
类型的参数,并像调用
testip(PeerIP)一样调用它您正在传递一个
字符*
,因此没有问题

如果使用
&PeerIP
,则类型将是指向数组的[
char(*)[4]
]指针,不是指向数组第一个元素[
char*
]的指针,它们是不同的类型

引用
C11
,第§6.3.2.1章,左值、数组和函数指示符(重点)

除非它是
sizeof
运算符的操作数、
\u
运算符的对齐操作数或 一元
&
运算符
,或者是用于初始化数组的字符串文字,一个具有 类型“”的数组“”已转换为类型为“”指向类型“”的指针的表达式 指向数组对象的初始元素,并且不是左值。[……]


类型不同,但都指向同一地址。只有指针算法会有所不同。@StoryTeller是对的,但后者仍然是错的。仅仅因为它们指向相同的地址并不意味着这些表达式可以互换。类型(重要事项:)它们确实非常重要。我刚刚有我的C++背景弹出。由于以下事实,可以“正确”地将指针转换到数组引用:)请注意,在调用它之前,应该声明(或定义)
testip()
。如果您这样做,编译器将能够告诉您
testip(&PeerIP)调用向函数传递了错误的类型-传递的是
int(*)[4]
而不是
int*
。了解如何使编译器坚持在使用函数之前使用严格的原型定义或声明函数,然后使用它。