gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 21:31:48 24 4
gpt4 key购买 nike

对于一个问题,我应该在我的 C 代码中编写的是:

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

但是我的编译器显示错误:

||warning: command line option '-Wzero-as-null-pointer-constant' is valid for C++/ObjC++ but not for C [enabled by default]|
C:\Users\Amir Khasru\Desktop\counting_sort.c||In function 'main':|
C:\Users\Amir Khasru\Desktop\counting_sort.c|13|error: subscripted value is neither array nor pointer nor vector|
||=== Build failed: 1 error(s), 1 warning(s) (0 minute(s), 0 second(s)) ===|

最佳答案

是的,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]);

但是这样的代码可能会令人困惑,因为您必须始终跟踪“您的”索引和“真实”索引之间的差异,并且很容易在您指的是另一个时意外地使用一个。

当然,在所有这些过程中,您必须小心确保数组的大小适合您正在使用的实际最小值和最大值。并记住“栅栏柱”错误!如果最小值为 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++)!”。

关于c - 我应该始终从索引 0 开始数组吗?如果我必须从其他地方开始,我该怎么办?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36483351/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com