指针下标从负值开始

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开始,以nrow-1结束。 但是我如何让行从-4开始并以nrow+3结束,也让列从-4开始并以nrow+3结束?

补充代码:

 #include  #include  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 

请注意,列的分配对每列进行一次,而不是在第一列中进行。 你拥有它的方式,任何超过第一列的东西都没有指向任何东西。

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

清理:

 ptr -= pre; for (i=0;i 

假设你的数组有7个元素,如下所示:

 +-----+-----+-----+-----+-----+-----+-----+ | | | | | | | | +-----+-----+-----+-----+-----+-----+-----+ 

如果指针指向数组的第一个元素,则可以将其索引为:

 p | v +-----+-----+-----+-----+-----+-----+-----+ | | | | | | | | +-----+-----+-----+-----+-----+-----+-----+ p[0] p[1] p[2] p[3] p[4] p[5] p[6] 

如果指针指向数组中间的元素,则可以使用负值对其进行索引。

  p | v +-----+-----+-----+-----+-----+-----+-----+ | | | | | | | | +-----+-----+-----+-----+-----+-----+-----+ p[-3] p[-2] p[-1] p[0] p[1] p[2] p[3] 

如果指针指向超过最后一个元素的一个元素,则可以仅使用负值对其进行索引。

  p | v +-----+-----+-----+-----+-----+-----+-----+ | | | | | | | | +-----+-----+-----+-----+-----+-----+-----+ p[-7] p[-6] p[-5] p[-4] p[-3] p[-2] p[-1] 

在第一个元素之前,pionter指向任何东西是无效的。 因此,无论指针在有效元素范围内指向何处,有效索引都不能小于-7或大于6。

来到你的问题

但是我如何让行从-4开始并以nrow+3结束,也让列从-4开始并以nrow+3结束?

你不能。 如果指针指向数组的第5个元素,则可以使用-4作为有效索引,但结束条件将为nrow-4 / nrow-4 ncol-4nrow + / nrow + 永远不会是正确的结束索引。

 float** ptr1 = &(5-th row of the array); for ( int i = -4; i < nrow - 4; ++i ) { // OK to use ptr1[i]; float* ptr2 = &(5-the element/column of the row) for ( int j = -4; j < ncol - 4; ++j ) { // OK to use ptr2[j]; } } 

你可以这样做,但我不认为你可以像这样访问列偏移量,你需要指向每一行。

 main() { int nrow,ncol; int i,j; float **ptr; float *p; /*allocation*/ nrow=5;ncol=7; ptr=(float **) malloc((nrow+7)*sizeof(float*)); for (i=0; i