我应该始终从索引0开始一个数组吗?如果我必须从其他地方开始,我该怎么办?

时间:2016-04-07 17:33:06

标签: c

对于我在c代码中应该写的问题是:

for (i=min ; i<=max ; i++)   b[i]=i;

但我的编译器显示错误:

  

||警告:命令行选项&#39; -Wzero-as-null-pointer-constant&#39;适用于C ++ / ObjC ++但不适用于C [默认启用] |
  C:\ Users \ Amir Khasru \ Desktop \ counting_sort.c ||在功能&#39; main&#39;:|
  C:\ Users \ Amir Khasru \ Desktop \ counting_sort.c | 13 | error:下标值既不是数组也不是指针也不是向量|
  || ===构建失败:1个错误,1个警告(0分钟,0秒(秒))=== |

3 个答案:

答案 0 :(得分:0)

是的,C中的数组是从0开始的。总是。你无法控制这一点。

C中数组的正常循环总是如下所示:

for(i = 0; i < max; i++)
    ... do something with arr[i] ...

请注意,i从0到max-1。请注意,条件为<,而不是<=

如果您想将数组视为从1到N,或从任意最小值到任意最大值,您可以通过各种方式模拟它。你可以遍历“你的”索引并将它们转换为循环中的“真实”数组索引:

int min = 10;
int max = 20;
int arr[11];

for(i = min; i <= max; i++)
    printf("%d: %d\n", i, arr[i-min]);

或者你可以循环实际索引并将它们转换为你自己的循环内部:

for(i = 0; i < N; i++) {
    int myindex = i + min;
    printf("%d: %d\n", myindex, arr[i]);

但是这样的代码可能会令人困惑,因为你必须始终跟踪“你的”索引和“真实”索引之间的区别,并且当你意味着另一个时,很容易意外地使用它。

当然,在所有这些中,您必须小心确保数组的大小适合您正在使用的实际最小值和最大值。并记住“fencepost”错误!如果你的分数是10而你的最大值是20,你需要一个大小为11而不是10的数组! (也就是说,您需要的大小通常为max - min + 1。)

如果你想模拟一个基于1的数组,你可以做的另一件事就是分配一个比你需要的更大的数据,并浪费单元格0:

#define N 10
int arr[N+1];    /* +1 so can make 1-based */

for(i = 1; i <= N; i++)
    arr[i] = i;

这样可以正常工作,但它也可能被认为有些风险,因为很容易忘记将数组1分配给它需要的大,你也可能会混淆代码的后来读者,谁会看到你写的

之类的东西
for(i = 1; i <= N; i++)

并说“不!那是错的!它应该是for(i = 0; i < N; i++)!”。

答案 1 :(得分:-1)

您应始终从0开始。使用for循环,将其更改为:

for (i=min ; i <max ; i++) b[i] = i;

答案 2 :(得分:-1)

由于数组的成员为0 ... n-1,其中n为元素数(在您的情况下为max),您应该写:

for (i=min ; i<max ; i++)   b[i]=i;

当然你可以从中间的某个地方开始,例如min= max/2;