C 字符数组的传递指针
我编写了一个函数,它的开头如下:C 字符数组的传递指针,c,arrays,C,Arrays,我编写了一个函数,它的开头如下: void fun(char *in,char *po) { char *i,*p; i=&in[0]; p=&po[0]; //some operation with *i and *p } fun(&arr1[0],&arr2[0]); 为什么该代码是正确的,为什么它会对以下代码发出警告: void fun(char *in,char *po) { cha
void fun(char *in,char *po)
{
char *i,*p;
i=&in[0];
p=&po[0];
//some operation with *i and *p
}
fun(&arr1[0],&arr2[0]);
为什么该代码是正确的,为什么它会对以下代码发出警告:
void fun(char *in,char *po)
{
char *i,*p;
i=∈
p=&po;
//some operation with *i and *p
}
大体上,我是这样调用函数的:
void fun(char *in,char *po)
{
char *i,*p;
i=&in[0];
p=&po[0];
//some operation with *i and *p
}
fun(&arr1[0],&arr2[0]);
既然我们将地址传递给两个数组的第一个索引,为什么第二个代码不起作用?我也不理解指针&0]中必须指定索引号。因为它只是一个指针而不是数组。当你写
i=∈时,请解释一下代码>,i
的类型为char*
,而中的&的类型为char**
,导致分配中的类型不匹配,从而发出警告。您应该避免从不同类型分配
如果您知道自己在做什么,则需要显式类型转换,除非该类型中至少有一个是void*
,[0]
中的表达式&为您提供指向数组中由中的指向的第一个元素的指针。它的类型是char*
中的表达式&为您提供指向中的指针的指针,类型为char**
。与第一次完全不同
还请注意,您不需要在[0]
中使用,只需在中使用i=in也可以
原因是[0]
中的相当于*(in+0)
,这意味着&in[0]
相当于&*(in+0)
,并且操作符的地址和解引用操作符相互抵消,因此它相当于(in+0)
,这当然与中的普通相同
此外,请注意数组自然会衰减为指向其第一个元素的指针,因此fun(&arr1[0],&arr2[0])
与fun(arr1,arr2)
在第一种情况下(i=&In[0];
)将数组的第一个元素的地址分配给i
(此地址的类型为char*
)
在第二种情况下(i=&In;
),您将In
中的参数的地址分配给i
,并且由于In
的类型为char*
,因此该地址的类型为char**
,这会导致您的警告