Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 字符数组的传递指针_C_Arrays - Fatal编程技术网

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**
,这会导致您的警告