在1处启动数组索引是否存在问题?

时间:2017-12-14 19:19:11

标签: c++ arrays

我的老师通常从一个开始索引数组。所以,基本上,当我们需要一个包含100个元素的数组时,他会使用

int a[101] 

而不是

int a[100]
例如,他就像这样填写:

for (int i = 1; i <= 100; i++)
    cin >> a[i];

使用此方法有任何问题,还是应该避免使用? (从0开始处理索引时我没有任何问题)

3 个答案:

答案 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字符,可能会显示无输出