c++ - 将数组的地址传递给 C++ 中的函数

标签 c++ arrays pointers

我是 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?

这是因为 aint [5] 类型,这意味着 &aint (*)[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/

相关文章:

c++ - 作为好友的成员函数 : Is the book Lippman 5th wrong?

c++ - 使用 Qt 和 Opengl 强制注销崩溃

c++ - putback() 和 unget() 的区别

arrays - 更新与辅助数组匹配的大型数组中的特定值(如 vlookup)

c - 在理解将 char* [] 传递给函数方面需要帮助

c++ - 删除后将 C++ 指针初始化为零?

c++ - 为什么我不能用两个参数重载 C++ operator[]?

javascript - 如何获取数组 B (由对象组成)中但不在数组 A 中的项目列表?

将二维数组转换为指针?

arrays - 为什么缓存局部性对阵列性能很重要?