是否可以在C中分配特定的索引范围,就像在fortran中一样:
allocate(f(istart-1:iend+1), u(istart-1:iend+1), uold(istart-1:iend+1))
do i = istart, iend
.
.
.
end do
答案 0 :(得分:1)
你不能直接,在C中没有意义,因为数组是连续元素的序列,第一个元素按照定义具有索引0 。事实上,C标准明确表示:
6.5.2.1数组下标
...
2后缀表达式后跟方括号[]中的表达式是下标 指定数组对象的元素。下标运算符[]的定义 是E1 [E2]与(*((E1)+(E2)))相同。由于转换规则 应用于二进制+运算符,如果E1是一个数组对象(等效地,指向 数组对象的初始元素),E2是整数,E1 [E2]表示E2 E1的元素(从零开始计数)。
但是您可以通过创建具有特定偏移的新指针来轻松地模拟它。假设您希望数组接受开始(包括)到结尾(独占)的索引(开始和结束是2个整数值,结束>开始):
int * arr = malloc((end - start) * sizeof(int));
arr -= start; // must be done in two steps because malloc return a void*
// and no pointer arithmetics is possible on void *;
for (int i=start; i<end; i++) {
arr[i] = ...;
...
}
...
free(arr + start); // do not forget the offset when freeing...
根据定义,arr[start] = *(arr + start) = *(arr_orig - start + start) = *arr_orig
答案 1 :(得分:1)
你想要什么基本上归结为设置数组的下限和上限,如Basic(和appranently Fortran):Dim Matrix(3, 4) As Integer
。
作为一种用途,我可以考虑在稀疏数组中处理一个部分,而不必分配完整的数组。
在C中你可以通过使用一个作为偏移量的整数变量来实现这一点,作为一个简单的例子:
int getElement(int *arr, int index, int offset)
{
return *(arr + (index-offset));
}
也可以使用更精细的方法,例如:
typedef struct MY_ARR {
int *arr;
int lowerbound; // from
int upperbound; // up and including
} t_myArr;
t_myArr *newArr(int lower, int upper)
{
t_myArr *p;
if (!(p= malloc(sizeof(t_myArr))) return 0;
if (!(p->arr= calloc(sizeof(int),upper-lower+1))) {free(p); return 0;}
p->arr.lowerbound= lower;
p->arr.upperbound= upper;
return p;
}
int getElement(t_myArr *p, int element)
{
if (!p || p->arr.lowerbound<element || element>p->arr.uperbound) return 0;
return(*(p->arr+element-lowerbound));
}
实质上,您现在已经创建了自己的整数数组类型。
答案 2 :(得分:0)
也许你想要这样的东西:
int array[100];
#define Array(index) array[(index) - 10]
int main() {
Array(10) = 1; // actually the same as array[0];
Array(11) = 2; // actually the same as array[1];
printf("%d\n", Array(10) + Array(11));
}
这真的是一个黑客,我不建议实际使用它。