我是 C++ 的新手,我对将指针数组传递给函数的想法感到困惑。
这是函数
void func(int *a){ a[0]=999;}
主要使用
int main()
{
int a[5]={1,2,3,4,5};
func(a);
std::cout << a[0]<< std::endl;
}
我理解这非常有效,因为数组的名称只是其第一个元素的地址。
根据我的理解,&a
指的是整个数组的地址,而a
指的是数组第一个元素的地址,应该和一致&a
。
但是,如果我使用
int main(){
int a[5]={1,2,3,4,5};
func(&a);
cout<< a[0]<< endl;
}
它返回编译器错误:第一个参数没有从“int (*)[10]”到“int *”的已知转换;删除 &
谁能解释一下这是怎么回事?
最佳答案
案例一
I understand this works perfectly as the name of an array is just the address of its first element.
上述说法在技术上是不正确的。第一个示例之所以有效,是因为在许多情况下(包括将数组作为参数按值传递给函数时)由于类型衰减,数组衰减指向其第一个元素的指针>。这意味着,在示例 1 中,当您将 a
作为参数传递时,存在一个隐式数组到指针的转换,它将您的数组 a
转换为 int 类型[5]
指向其第一个元素的指针,类型为 int*
。因此在示例1中,参数的类型和参数的类型匹配,示例1成功。
另请注意,即使衰减指针和数组地址都具有相同的值,它们的类型也不同。衰减指针的类型为 int*
而&a
的类型为 int (*)[5]
。
案例2
Could anyone please explain what's going on here?
这是因为 a
是 int [5]
类型,这意味着 &a
是 int (*)[5 ]
与参数 int*
的类型不匹配。
也就是说,当你修改你的代码时,你传递的是 &a
,它是 int (*)[5]
类型,但函数参数是 类型>int*
,因此参数类型与您传递的参数不匹配,因为没有从 int (*)[5]
到的隐式转换int*
我们得到提到的错误:
no known conversion from 'int (*)[5]' to 'int *'
关于c++ - 将数组的地址传递给 C++ 中的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72406614/