C++ 为什么将实际数组(不是数组变量)作为参数传递给函数会引发错误?
所以,我试图从头开始学习指针,我偶然发现了这个。 我试着做了以下几点:C++ 为什么将实际数组(不是数组变量)作为参数传递给函数会引发错误?,c++,C++,所以,我试图从头开始学习指针,我偶然发现了这个。 我试着做了以下几点: void func(int* ptr){ //Yada-yada } int main(){ int a[] = {1,2,3,4,5}; func(a); } void func(int* ptr){ //Yada-yada } int main(){ int a[] = {1,2,3,4,5}; func({1,32}); } 结果很好。但后来,我试着做了以下几点: void func(int
void func(int* ptr){
//Yada-yada
}
int main(){
int a[] = {1,2,3,4,5};
func(a);
}
void func(int* ptr){
//Yada-yada
}
int main(){
int a[] = {1,2,3,4,5};
func({1,32});
}
结果很好。但后来,我试着做了以下几点:
void func(int* ptr){
//Yada-yada
}
int main(){
int a[] = {1,2,3,4,5};
func(a);
}
void func(int* ptr){
//Yada-yada
}
int main(){
int a[] = {1,2,3,4,5};
func({1,32});
}
它返回了一个错误,说
初始值设定项值太多
所以我把它换成了
结果是
“int”类型的值不能用于初始化“int*类型的实体
所以我想知道为什么会这样。编译器是否为未用作变量右值的数组分配空间??因为如果是这样,那么预期的结果将是在{1,32}或{1}情况下,ptr
被传递第一个变量的地址
提前谢谢。
附言:只有当你想帮忙的时候才回答这个问题。如果你有意见告诉我去读一本书或什么的,我已经在读了。但是对于那些真正想提供帮助的人来说,参考文献的链接是非常感谢的。
{1,32}
不是“实际的数组”。这是一个括号内的初始化器列表。指针参数不能用这样的列表初始化,除非列表正好包含一个可转换为指针类型的初始化器。{1,32}
不是“实际数组”。这是一个括号内的初始化器列表。指针参数不能用这样的列表初始化,除非列表正好包含一个可转换为指针类型的初始化器。{1,32}
是一个std::initialized_list
,不能转换为int*
。阅读{1,32}
不是数组。它没有一个完全根据C++语言规范的类型。它是一种可以用来初始化对象的语法结构。有时,可以从中推断出对象的属性,但这些是例外,而不是规则。@StoryTeller UnslanderMonica您应该将其作为答案发布。{1,32}
是一个std::initialized_list
,不能转换为int*
。阅读{1,32}
不是数组。它没有一个完全根据C++语言规范的类型。它是一种可以用来初始化对象的语法结构。有时,可以从中推断出对象的属性,但这些是例外情况,而不是规则。@StoryTeller UnslanderMonica您应该将其作为答案发布。因此,第二种情况失败,因为具有多个项的初始值设定项列表通常不兼容。第三种情况则会失败,因为如果包含的int
兼容,则包含1项的列表将兼容,但不兼容。(OP很幸运,最后一个代码片段导致了更多的混乱。)因此,第二个案例失败了,因为具有多个项目的初始值设定项列表通常不兼容。第三种情况则会失败,因为如果包含的int
兼容,则包含1项的列表将兼容,但不兼容。(幸运的是,这篇文章最后一个片段引起了更多的混乱。)