我知道你不能使用数组的初始化列表。但是我听说过你可以用类似于初始化列表的方式设置指向NULL的指针的方法。
我不确定这是怎么做到的。我听说默认情况下指针设置为NULL,但我不知道这是否在C ++标准中得到保证。我也不确定与正常分配相比,通过new运算符初始化是否也会产生影响。
编辑:我的意思是在头文件/构造函数初始化列表中执行此操作。我不想把它放在构造函数中,我也不想使用Vector。
答案 0 :(得分:36)
为了在构造函数初始值设定项列表中设置指向空值的指针数组,可以使用()
初始化程序
struct S {
int *a[100];
S() : a() {
// `a` contains null pointers
}
};
不幸的是,在当前版本的语言中,()
初始值设定项是唯一可以在构造函数初始值设定项列表中与数组成员一起使用的初始值设定项。但显然这就是你需要的东西。
()
对使用new[]
int **a = new int*[100]();
// `a[i]` contain null pointers
在其他情况下,您可以使用{}
聚合初始值设定项来实现相同的效果
int *a[100] = {};
// `a` contains null pointers
请注意,绝对不需要在0
之间挤压NULL
或{}
。空对{}
会很好。
答案 1 :(得分:6)
您可以从数组切换到std::vector
并使用
std::vector<T*> v(SIZE);
值将由NULL
自动初始化。这是首选的C ++方式。
更新:从C ++ 11开始,还有一种方法:使用
std::array<T*, SIZE> array = {};
这更像是C样式数组的更正版本(特别是避免动态分配),它的大小包含并且不会衰减到指针。但是,需要在编译时知道大小。
答案 2 :(得分:4)
通常默认情况下不会初始化数组,但如果您明确初始化一个或多个元素,那么任何剩余的元素将自动初始化为0.因为0和NULL
是等效的,因此可以初始化一个数组指向NULL
的指针如下:
float * foo[42] = { NULL }; // init array of pointers to NULL
答案 3 :(得分:2)
我不确定这是怎么做到的。我听说默认情况下指针设置为NULL,但我不知道这是否符合C ++标准。
它不受C ++标准的保证。除非另有设置,否则内置类型(如指针)将填充垃圾。
我也不确定与正常分配相比,通过新运营商进行初始化是否也会产生影响。
“正常分配”是什么意思?如果您正在谈论自动变量,那么您可以这样做:
MyType * pointers[2] = {}
并且指针应该初始化为NULL。
答案 4 :(得分:0)
void* p[10] = { 0 };
答案 5 :(得分:-1)
如果你有一个成员数组,那么就没有办法初始化,除非它是一个静态成员。如果数组不是静态成员,那么你必须在构造函数体内填充它。
那就是说,使用std::vector
你真的会更好。除了技术原因(例如平台无法使用标准STL)或性能稍差外,std::vector
优于任何和所有标准的阵列。如果性能问题,那么请确保您通过数字进行分析并了解这是一个问题。