将数组的地址传递给 C++ 中的函数
Passing the address of an array into a function in C++
我是 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;
}
它returns编译错误:no known conversion from 'int (*)[10]' to 'int *' for 1st argument; remove &
谁能解释一下这是怎么回事?
案例一
I understand this works perfectly as the name of an array is just the address of its first element.
以上说法在技术上是不正确的。第一个示例之所以有效,是因为在许多情况下(包括将数组作为参数按值传递给函数时)由于 ,数组 衰减 指向指向其第一个元素的指针类型衰减。这意味着,在示例 1 中,当您将 a
作为参数传递时,有一个隐式 array-to-pointer 转换将类型 int[5]
的数组 a
转换为指向它的指针第一个元素是 int*
类型。因此在示例1中,参数的类型和参数的类型匹配并且示例1成功。
另请注意,即使衰减指针和数组地址都具有相同的值,但它们的类型不同。衰减指针的类型为 int*
而 &a
的类型是 int (*)[5]
.
案例二
Could anyone please explain what's going on here?
这是因为 a
是 int [5]
类型,这意味着 &a
是 int (*)[5]
类型,与参数 [=14] 的类型不匹配=].
也就是说,当您修改代码时,您传递的 &a
是 int (*)[5]
类型,但函数参数是 int*
类型,因此在参数的类型和你传递的参数,因为没有从 int (*)[5]
到 int*
的隐式转换,我们得到提到的错误:
no known conversion from 'int (*)[5]' to 'int *'
I understand this works perfectly as the name of an array is just the address of its first element.
这是一个微妙的错误理解。数组 int[10]
可以隐式转换为指向第一个元素 int*
(的地址)的指针。当您调用接受 int*
参数并传递 int[10]
参数的函数时,就会发生这种隐式转换。
&a
refers to the address of the entire array while a
refers to the address of the first element of the array, which should be identical to &a
指针的值是相同的。但是指针的类型不同。一个是指向数组 int (*)[10]
的指针,另一个是指向此类数组 int*
的元素的指针。两种类型都不会隐式转换为另一种类型,因此您不能将 &a
作为参数传递给需要 int*
的函数。语言的类型系统可以防止你犯错误。编译器诊断消息对此进行了解释。
将a
视为指针。它指向数组的第一个元素,a[0]
(或*a
)。
那么&a
就是指针的地址,与上面无关
注意(&a)[0]
或*(&a)
return指针,而(&a)[0][0]
或(*(&a))[0]
或*((&a)[0])
或**(&a)
return数组的第一个元素。
我是 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;
}
它returns编译错误:no known conversion from 'int (*)[10]' to 'int *' for 1st argument; remove &
谁能解释一下这是怎么回事?
案例一
I understand this works perfectly as the name of an array is just the address of its first element.
以上说法在技术上是不正确的。第一个示例之所以有效,是因为在许多情况下(包括将数组作为参数按值传递给函数时)由于 ,数组 衰减 指向指向其第一个元素的指针类型衰减。这意味着,在示例 1 中,当您将 a
作为参数传递时,有一个隐式 array-to-pointer 转换将类型 int[5]
的数组 a
转换为指向它的指针第一个元素是 int*
类型。因此在示例1中,参数的类型和参数的类型匹配并且示例1成功。
另请注意,即使衰减指针和数组地址都具有相同的值,但它们的类型不同。衰减指针的类型为 int*
而 &a
的类型是 int (*)[5]
.
案例二
Could anyone please explain what's going on here?
这是因为 a
是 int [5]
类型,这意味着 &a
是 int (*)[5]
类型,与参数 [=14] 的类型不匹配=].
也就是说,当您修改代码时,您传递的 &a
是 int (*)[5]
类型,但函数参数是 int*
类型,因此在参数的类型和你传递的参数,因为没有从 int (*)[5]
到 int*
的隐式转换,我们得到提到的错误:
no known conversion from 'int (*)[5]' to 'int *'
I understand this works perfectly as the name of an array is just the address of its first element.
这是一个微妙的错误理解。数组 int[10]
可以隐式转换为指向第一个元素 int*
(的地址)的指针。当您调用接受 int*
参数并传递 int[10]
参数的函数时,就会发生这种隐式转换。
&a
refers to the address of the entire array whilea
refers to the address of the first element of the array, which should be identical to&a
指针的值是相同的。但是指针的类型不同。一个是指向数组 int (*)[10]
的指针,另一个是指向此类数组 int*
的元素的指针。两种类型都不会隐式转换为另一种类型,因此您不能将 &a
作为参数传递给需要 int*
的函数。语言的类型系统可以防止你犯错误。编译器诊断消息对此进行了解释。
将a
视为指针。它指向数组的第一个元素,a[0]
(或*a
)。
那么&a
就是指针的地址,与上面无关
注意(&a)[0]
或*(&a)
return指针,而(&a)[0][0]
或(*(&a))[0]
或*((&a)[0])
或**(&a)
return数组的第一个元素。