2017-03-27 67 views
-3

我对指针和C一般都很陌生。C指针2维移动到顶部

void moveUpToTop(int num, int dim, int index) { 
    int i,j; 
    double *temp = w[index]; 
    double *zero = w[0]; 
    for(i = index; i > 0; i--) { 
     double *ptrA = w[i]; 
     double *ptrB = w[i - 1]; 
     for(j = 0; j < dim; j++) { 
      *(ptrA + j) = *(ptrB + j); 
     } 
    } 

    for(j = 0; j < dim; j++) { 
     *(zero + j) = *(temp + j); 
    } 
} 

用一个2维数组w定义为double ** w。我想使用指针将索引“index”的数组值移动到数组顶部,因为这是我们必须做的练习。首先,我保存了一个阵列位置,然后我将所有阵列位置向上移动一次。 我在做什么错?

鉴于我是下面的代码,我必须设计排序功能。

double **w; 
int main (void) { 
    int dim, num; 
    int i, j; 

    scanf ("%d %d", &dim, &num); 
    w = calloc (num, sizeof (double *)); 
    for (i = 0; i < num; i++) { 
     w[i] = calloc (dim + 1, sizeof (double)); 

     int sum = 0; 
     for (j = 0; j < dim; j++) { 
      scanf ("%le", &w[i][j]); 
      sum += w[i][j] * w[i][j]; 
     } 
     w[i][dim] = sqrt(sum); 
    } 

    sort(num, dim); 
    for(i = 0; i < num; i++) { 
     for(j = 0; j < dim; j++) { 
      printf("%e ", w[i][j]); 
     } 
     printf("\n"); 
    } 

    return 0; 
} 
+0

'double **'不定义二维数组。这是一个指针指针。它只是非常轻微的表现得像一个数组。 – StoryTeller

+0

'double **'不是二维数组,不能指向一个。如果您需要,可以使用2D阵列。阅读[问],提供[mcve]。 – Olaf

+0

你是什么意思“移动一些数组的值索引”索引“直到阵列的顶部”? – user2357112

回答

0

你的问题是,你保存一个指向原始数据的指针,但你不保存数据本身。

double *temp = w[index]; // Here you save the pointer 

,但在第一循环中,您覆盖数据:

for(i = index; i > 0; i--) { 
    double *ptrA = w[i];   // Same as w[index] in first loop 
    double *ptrB = w[i - 1]; 
    for(j = 0; j < dim; j++) { 
     *(ptrA + j) = *(ptrB + j); // The data pointed to by w[index] is overwritten 
            // in the first loop 

所以这个代码是没有复制的指数的原始数据:

for(j = 0; j < dim; j++) { 
    *(zero + j) = *(temp + j); // Data at index have been overwritten 
           // so this doesn't do what you want 
} 

为了解决这个问题,这是不够的保存指向index(即double *temp = w[index];)的指针。相反,您需要保存所有double *temp = w[index];指向的数据。

所以你需要malloc一些数据来保存副本。然后将数据复制到for循环中,并在恢复到zero时使用复制的数据。

顺便说一句:还注意到给你的代码使用了一个非常丑陋的构造。它正在分配dim + 1以节省额外的两倍。因此,您的移动功能也需要使用dim + 1而不是dim