我写了一个这样开始的函数:
void fun(char *in,char *po)
{
char *i,*p;
i=&in[0];
p=&po[0];
//some operation with *i and *p
}
为什么该代码是正确的,为什么它对下面的代码发出警告:
void fun(char *in,char *po)
{
char *i,*p;
i=∈
p=&po;
//some operation with *i and *p
}
在 main 中,我这样调用函数:
fun(&arr1[0],&arr2[0]);
既然我们将地址传递给两个数组的第一个索引,为什么第二个代码不起作用?我也不理解指针 &in[0] 必须指定索引号。因为它只是一个指针而不是一个数组。请解释
最佳答案
表达式 &in[0]
为您提供指向数组中第一个元素的指针,该元素由 in
指向。它的类型是char *
。
表达式&in
给你一个指向指针in
的指针,类型是char **
。与第一个完全不同。
另请注意,您不需要 &in[0]
,只需执行 i = in
即可。
原因是 in[0]
等价于 *(in + 0)
,这意味着 &in[0]
是等价的&*(in + 0)
和取地址和解引用运算符相互抵消,所以它等同于 (in + 0)
当然是一样的就像普通的 in
一样。
此外请注意,数组自然会衰减为指向其第一个元素的指针,因此 fun(&arr1[0],&arr2[0])
与 fun(arr1, arr2)
.
关于c - 传递字符数组的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34037049/