2016-06-18 2 views
-2

В студии visuals я пытаюсь сделать соответственно сумму строк. но первая сумма умножается на 4. я не понял эту ситуациюdouble pointer help me

get_sum(int **q, int p, int n); 

int main(void) 
{ 
    int num[3][5] = { 10,11,12,13,14,15,16,17,18,19,20,21,22,23,24 }; 
    get_sum(&num[0][0], 3, 5); 
} 
get_sum(int **q, int p, int n) 
{ 
    /*for (int i = 0; i < ; i++) 
    printf("%d\n", *(q + i));*/ 

    for (int k = 0; k < p; k++) 
    { 
     int sum = 0; 

     for (int i = 0; i < n; i++) 
     { 
      sum =*(q + n*k + i)+sum; 
      printf("%d\n", sum); 
     } 

    } 
} 
+0

, когда вы передаете свой 2D-массив своей функции get-sum, почему вы используете двойной указатель? Я думаю, вы немного смущены. посмотрите здесь http://c-faq.com/aryptr/dynmuldimary.html – mik1904

ответ

0

Вы индексировать массив 1-D, как будто это 2-D массив а, но нет никакой необходимости, чтобы определить его как 2-D, и в любом случае, вы инициализируетесь как если бы это был 1-мерный массив.

#include <stdio.h> 

void get_sum(int *q, int p, int n);         // only one start 

int main(void) 
{ 
    int num[] = { 10,11,12,13,14,15,16,17,18,19,20,21,22,23,24 }; // 1-D linear array 
    get_sum(num, 3, 5); 
    return 0; 
} 

void get_sum(int *q, int p, int n)         // added return type 
{ 
    int k, i, sum; 
    for (k = 0; k < p; k++) { 
     sum = 0; 
     for (i = 0; i < n; i++) { 
      sum = *(q + n*k + i) + sum; 
     } 
     printf("%d\n", sum);          // moved out of inner loop 
    } 
} 

выход программы

60 
85 
110 

В качестве альтернативы, если вы хотите массив 2-D, а затем индекс в нем, как если бы это был массив 1-D, вы можете сделать это. Примечание. Я инициализировал массив по-разному, но get_sum - это то же самое.

#include <stdio.h> 

void get_sum(int *q, int p, int n);         // only one start 

int main(void) 
{ 
    int num[3][5] = {{10,11,12,13,14}, {15,16,17,18,19}, {20,21,22,23,24}}; 
    get_sum(&num[0][0], 3, 5); 
    return 0; 
} 

void get_sum(int *q, int p, int n)         // added return type 
{ 
    int k, i, sum; 
    for (k = 0; k < p; k++) { 
     sum = 0; 
     for (i = 0; i < n; i++) { 
      sum = *(q + n*k + i) + sum; 
     } 
     printf("%d\n", sum);          // moved out of inner loop 
    } 
} 
2

Если я понимаю, что вы просто хотите создать функцию, которая суммирует элементы массива, переданного в качестве параметра, наряду с размерами массива, то у вас есть правильная идея, но крайне неправильно синтаксис.

Вместо того, чтобы устно обсуждать каждое изменение, простой пример содержит все изменения. Посмотрите на изменения и почему они были сделаны:

#include <stdio.h> 

int get_sum (int (*q)[5], int p, int n); 

int main (void) 
{ 
    int num[3][5] = {{ 10, 11, 12, 13, 14 }, 
        { 15, 16, 17, 18, 19 }, 
        { 20, 21, 22, 23, 24 }}; 

    int sum = get_sum (num, 3, 5); 
    printf (" -----------\n sum : %d\n", sum); 

    return 0; 
} 

int get_sum (int (*q)[5], int p, int n) 
{ 
    int sum = 0; 

    for (int k = 0; k < p; k++) { 
     for (int i = 0; i < n; i++) 
      sum += q[k][i]; 
     printf ("row[%2d] : %d\n", k, sum); 
    } 
    return sum; 
} 

(примечание:. выходной контур в get_sum обеспечивает работают ИТОГ в sum после добавления каждого ряда элементов Вы можете настроить это, чтобы удовлетворить ваши потребности.)

Пример использования/вывода

$ ./bin/get_sum 
row[ 0] : 60 
row[ 1] : 145 
row[ 2] : 255 
    ----------- 
    sum : 255 

Позвольте мне знать, если у вас есть какие-либо вопросы.