我有这样一个结构体:
struct noduri {
int nod[100];
};
和这个函数:
int clearMatrix(int var)
{
cout << all[1].nod[30];
}
int main()
{
noduri all[100];
cout << all[1].nod[30];
return 0;
}
,我想将结构体分配给数组all[]
的所有100个元素,当我执行cout << all[1].nod[30];
时,一切正常,没有错误,它输出0
。当我调用clearMatrix(1)
时,我得到这个错误:error: request for member nod in all[1], which is of non-class type int
,我做错了什么?
数组变量all
是main
函数的局部变量,所以你不能在clearMatrix
中引用它,除非你将指向它的指针传递给函数:
int clearMatrix(int var, noduri *all)
{
cout<<all[1].nod[30];
}
int main()
{
noduri all[100];
clearMatrix(5, all);
return 0;
}
如果你在函数中引用的数组不在它的作用域内,你需要用
int clearMatrix(int var,noduri *all)
{
cout<<all[1].nod[30]; // as here you have the base address of the array of type noduri you can refer it.
}
int main()
{
noduri all[100];
clearMatrix(5, all);
return 0;
}
您正在使用原始数组。这不是个好主意。如果在编译时不知道大小,请使用std::vector
,如果在编译时知道大小,请考虑使用std::array
,动态调整大小会导致可测量的性能问题。
c++中原始数组的一个问题是,将它们传递给函数(比如int
或double
)一点也不容易。相比之下,std::vector
和std::array
与其他普通类型一样容易传递给函数。
下面是一个完整的例子:
#include <array>
#include <iostream>
struct noduri {
std::array<int, 100> nod;
};
void clearMatrix(std::array<noduri, 100> const &array) {
std::cout << array[1].nod[30];
}
int main() {
std::array<noduri, 100> all;
std::cout << all[1].nod[30];
}
注意,std::array仅在编译器支持c++ 11时可用。对于较旧的编译器,使用boost::array
或直接使用std::vector
。
您所展示的代码将不会被编译,并且没有任何意义。如果我理解正确的话,你想通过函数clearMatrix中的一些值来分配数组的每个元素。如果是这样,那么代码将如下所示
#include <iostream>
struct noduri
{
int nod[100];
};
int clearMatrix( noduri *matrix, int size, int var )
{
for ( int i = 0; i < size; i++ )
{
for ( int &n : matrix[i].nod ) n = var;
}
}
int main()
{
const int N = 100;
noduri all[N] = {};
std::cout << all[1].nod[30] << std::endl;
clearMatrix( all, N, 10 );
std::cout << all[1].nod[30] << std::endl;
return 0;
}