对于我在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秒(秒))=== |
答案 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;
。