回答
memset(a, 0, 100 * 200 * sizeof(int));
应该这样做。
尝试memset(a,0,sizeof(a));
这简单地将覆盖使用由阵列与0字节的存储器。除非你真的知道你做什么,否则不要为用户定义的数据类型执行此操作。还有std::fill
和std::fill_n
,这是更多的C++ ISH(但不是这里最简单的方法)。
即使对于非用户定义的数据类型,这可能会产生意想不到的结果。数据成员指针是一个在GCC和Clang(“Itanium ABI”)使用的C++-ABI中使用非0×0空指针编码的示例 - 它们使用全1位。对于“int”,这应该没问题。 – 2010-08-27 20:55:04
不应该在这里使用'sizeof(a)* sizeof(int)'吗? – Mikhail 2012-12-02 22:45:43
不,数组sizeof以字节返回正确的大小,因此不需要乘以int大小。 – 2012-12-03 02:18:23
如果这个数组是在文件范围声明的,或者在函数范围内声明为'static',那么它会自动初始化为零,你不必做任何事情。这只适用于一个在程序启动时的初始化;如果你需要重置它,你必须自己编码。我会使用memset
。
如果它在不带静电的功能范围内声明的,你需要使用memset
,或显式的初始化 - 单= { 0 }
是不够的,你不需要写出所有200个零喜欢别人建议。
还应该补充说明静态变量与非静态声明的变量的语义是非常不同的。声明为静态的变量固有地声明一个状态;这可能不是OP想要的。我同意memset方法(或明确的初始化方法)。 – Schedler 2010-08-27 18:04:33
尝试
int a[100][200] = {{0}};
如果初始化一些(但不是全部)的元素,其余的将被初始化为零。在这里,你只是明确地初始化第一个子数组的第一个元素,编译器正在处理其余的部分。
+1'= {0}'也应该有效,但这可能会更好地避免编译器警告。 – Potatoswatter 2010-08-27 20:30:25
为了缩短它,C++允许'= {};'。 – 2010-08-27 20:45:12
“我无法在声明点初始化”是什么意思? “不知道如何”?或者“不能修改那里的代码”?
C++语言的特征在于在声明点
int a[100][100] = {};
初始化整个阵列为0(注意,没有明确0
是{}
之间确实需要)。你可以使用它吗?
如果不能,那么你的选择是:使用memset
-hack,1D-重新解释,黑客或通过数组(S)迭代(有或没有帮助FO std::fill
)设置的每个元素明确。
声明时的初始化是被禁止的,例如,当goto或switch切换到声明中时,就会将其转换为变量的作用域。 – Potatoswatter 2017-02-06 02:05:43
提到的memset
方法(memset(a,0,sizeof(a));
)会起作用,但是如何使用C++方式(根据您的标记)以及使用向量?
std::vector<std::vector<int> > a;
a.assign(100, std::vector<int>(200));
C++允许多维数组完全通过基元素指针进行迭代。所以,你可以使用std::fill
,并将它传递的第一个非数组元素
std::fill(a[0] + 0, a[99] + 100, 0);
在C,这是正式不允许的,你需要通过每个单独子阵列迭代,因为迭代超越了第一子阵列的过去,在C指针导致C中未定义的行为尽管如此,实际上这仍然有效。
这仍然是真的吗? (是否曾经?) – Potatoswatter 2017-02-06 02:04:31
我测试了这个解决方案,它工作。
int arr[100][200];
for (int i=0; i<100; i++)
for (int j=0; j<200; j++) (arr[i][j] = 0);
for (int i=0; i<100; i++)
for (int j=0; j<200; j++) cout << (arr[i][j]);
对于C++,您可以使用算法头中的std:fill方法。
int a[x][y];
std::fill(a[0], a[0] + x * y, 0);
所以,你的情况,你可以这样做:
int a[100][200];
std::fill(a[0], a[0] + 100 * 200, 0);
当然,0可以为任何int值被改变。
许多答案使用指针运算与fill
。这是可以做到简单:
int a[N][K];
fill(a[0], a[N], 0);
基本上,a[N]
是多维数组后第一个内存地址,不管有多少尺寸也有。这工作太:
int a[N][K][L][M];
fill(**a[0], **a[N], 0);
这里的星号解引用指针下降到int*
类型(数组括号解引用int****
到int***
,两个星号做工作的其余部分)。
- 1. Javascript/jQuery填充多维数组...数组与数组元素
- 2. Javascript - 组合多维数组的元素
- 3. 计数多维数组元素VB.NET
- 4. 多维数组,0键
- 5. MQL4 - ArrayCopy - 将一维数组复制到多维数组元素
- 6. PHP:一维数组到多维数组与元素的乘法
- 7. 初始化多维数组:{0}与{{{0}}}
- 8. 总和多维数组元素的
- 9. PHP多维数组元素被跳过
- 10. 多维数组元素的基础
- 11. 将元素添加到多维数组
- 12. 初始化多维数组元素
- 13. 向多维数组添加元素
- 14. 添加元素多维数组
- 15. 元素多维数组的,爪哇
- 16. php echo单元素多维数组
- 17. 显示多维数组元素
- 18. 多维数组元素验证
- 19. 移动多维数组的元素
- 20. 合并多维数组元素在PHP
- 21. JavaScript和多维数组元素值
- 22. Ruby-访问元素多维数组
- 23. 更改元素的多维数组php
- 24. 删除多维数组的父元素?
- 25. 多维数组中的新元素
- 26. 多维数组,元素访问矢量
- 27. 填充Java多维数组
- 28. PHP - 填充多维数组
- 29. Python:填充多维数组
- 30. 填充多维数组
为什么你不能在声明的时候初始化它们? – 2010-08-27 17:44:50
你想在课堂上申报吗? – cpx 2010-08-27 18:06:59