我的老师通常从一个开始索引数组。所以,基本上,当我们需要一个包含100个元素的数组时,他会使用
int a[101]
而不是
int a[100]
例如,他就像这样填写:
for (int i = 1; i <= 100; i++)
cin >> a[i];
使用此方法有任何问题,还是应该避免使用? (从0开始处理索引时我没有任何问题)
答案 0 :(得分:16)
我应该定期使用,还是应该避免使用?
你应该避免它。一个问题是,99.9%的C ++开发人员不会与您和您的老师分享这种坏习惯,因此您会发现他们的代码难以理解,反之亦然。但是,这有更糟糕的问题。这样的索引会与任何标准算法以及其他跟随它们的其他算法冲突,您必须编写明确的讨厌代码来将其修复为container.begin()
和container.end()
以及std::begin()
和{{1}使C样式数组符合基于0的C ++标准。
注意:正如范围循环的注释中所提到的那样,隐式使用std::end()
也会因为同样的原因而被破坏。虽然这个问题更糟糕,因为隐式使用了范围,在这种情况下没有简单的方法可以使范围循环工作。
答案 1 :(得分:1)
Arrays in C++和C为零索引,意味着第一个数组元素用0
编号,最后一个元素在subscript operator[]访问时用N-1
编号。当你的代码跳过a[0]
的第一个数组元素时,开始使用a[1]
的第二个元素,所以你应该避免那个练习。
答案 2 :(得分:-1)
int
的大小实际上取决于编译器。在处理器曾经是16位的时代,int
是2个字节。如今,它通常是32位和64位系统上的4个字节。
检查int
大小的最佳方法是
cout << sizeof(int);
<小时/> 假设:sizeof(int)=架构中的4个字节。
当你宣布声明时
int array[10];
您告诉编译器保留40个BYTES(基于上面的假设。)
您只使用9个元素(1-9),其中40个36字节分配浪费4个字节的内存。 只是内存便宜并不意味着它的免费。如果您使用三维数组,则更多。
示例:的
int array[100][100][100]
你最终将失去大量内存我的意思是其他进程需要的大量内存,但不能仅仅因为你故意保留它而不使用它。
如果您正在使用角色阵列,那么您可能会遇到灾难。
例如:
char str[8];
str[1] = 'H';
str[2] = 'e';
str[3] = 'l';
str[4] = 'l';
str[5] = 'o';
str[6] = '\0';
cout<<str;
由于str[0]
可能包含NULL
字符,可能会显示无输出。