c - 指针下标从负值开始

标签 c arrays pointers

int nrow=5,ncol=7,i,j;
float **ptr;
/*allocation*/
ptr=(float **) malloc(nrow*sizeof(float*));
ptr[0]=(float *) malloc(nrow*ncol*sizeof(float));
/*initialize*/
for (i=0;i<nrow;i++)
    for (j=0;j<ncol;j++) ptr[i][j]=0.0;

我们知道在上面的例子中,行从0开始到nrow-1结束,列从0开始到结束在 ncol-1 中。但是如何才能让行从-4开始到nrow+3结束,同时让列从-4开始到结束? ncol+3?

补充代码:

#include <stdio.h>
#include <stdlib.h>

float *vector(int nl, int nh){
/* allocate a float vector with subscript range v[nl..nh] and initializing
       this vector, eg. vector[nl..nh]=0.0 */
    float *v;
    int i,NR_END=0;

    v=(float *)malloc((size_t) ((nh-nl+1+NR_END)*sizeof(float)));

    for (i=0;i<(nh-nl+1+NR_END);i++) v[i]=0.0;
    return v-nl+NR_END;
}

int main(int argc, char *argv[])
{
    int i,nrow=5, row1, row2;
    float *v;
    row1=-4;
    row2=nrow+3;
    v = vector(row1,row2);
    for (i=-4;i<(nrow+4);i++) {
        v[i]=(float)i; 
        printf("v[%d]=%f\n",i,v[i]);
    }
exit(0);
}

如果我运行上面的代码,它会得到正确的答案:

 v[-4]=-4.000000
 v[-3]=-3.000000
 v[-2]=-2.000000
 v[-1]=-1.000000
 v[0]=0.000000
 v[1]=1.000000
 v[2]=2.000000
 v[3]=3.000000
 v[4]=4.000000
 v[5]=5.000000
 v[6]=6.000000
 v[7]=7.000000
 v[8]=8.000000

最佳答案

严格来说,不能在数组开始之前或结束之后进行索引。但是,您可以使数组比您预期的更大,并将起始指针放在中间的某个位置:

int nrow = 5, ncol = 5, pre = 4, post = 4;
int i,j;
float **ptr;

ptr = malloc((nrow+pre+post)*sizeof(float*));
for (i=0;i<nrow+pre+post;i++)
    ptr[i] = malloc((ncol+pre+post)*sizeof(float));
    ptr[i] += pre;   // move up start of column pointers
}
ptr += pre;  // move up start of row pointer

/*initialize*/
for (i=0;i<nrow;i++) {
    for (j=0;j<ncol;j++) {
        ptr[i][j]=0.0;
    }
}

请注意,列的分配是对每一列进行一次,而不是在第一列中成堆进行。按照您的方式,第一列之后的任何内容都不指向任何内容。

现在您可以安全地访问从 -4 到 max + 3 的索引。

清理:

ptr -= pre;
for (i=0;i<nrow+pre+post;i++)
    ptr[i] -= pre;
    free(ptr[i]);
}
free(ptr);

关于c - 指针下标从负值开始,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51389816/

相关文章:

C 链表向末尾添加节点

c - 将 printf 转换为 printf x[i],其中 i 的实际值不是 "x[i]"

c - 文件内容不会读入结构

c - 如何在 C 中与 Linux 一起使用共享内存

c - 错误检查,寻求一些指导

c# - 如何将 int 转换为具有两个固定值的字节数组

PHP MVC 路由 -> 如何将 uri 数组元素转换为对路由有用的字符串?

c - 为什么在 C 中向后迭代数组比向前迭代快

c++ - 如何使用指针访问动态结构数组的成员?

c - 指向结构的简单指针