указатель на указатель? - PullRequest
       1

указатель на указатель?

2 голосов
/ 11 ноября 2011

Я изучаю C, в настоящее время указатели.

#include <cstdio>
#include <cstring>
#include <cstdlib>

using namespace std;

int f1(int **w){
    for (int i=0;i<2;i++){
        for (int j=0;j<10;j++){
            w[i][j]=10;
            printf("%d ",w[i][j]);
        }
        printf("\n");
    }
    printf("----\n");
}

int main () {


    int **w = (int **) malloc(sizeof(int*)*2);
    for (int i=0;i<2;i++)
        w[i] = (int*)malloc(sizeof(int)*10);

    for (int i=0;i<2;i++){
        for (int j=0;j<10;j++){
            w[i][j]=i*10 + j;
            printf("%d ",w[i][j]);
        }
        printf("\n");
    }
    printf("---\n");
    f1(w);
        for (int i=0;i<2;i++){
        for (int j=0;j<10;j++){
            w[i][j]=i*10 + j;
            printf("%d ",w[i][j]);
        }
        printf("\n");
    }

    return 0;
}

Итак, у меня есть этот код

и вот вывод:

0 1 2 3 4 5 6 7 8 9 10
11 12 13 14 15 16 17 18 19
--- 
10 10 10 10 10 10 10 10 10 10 
10 10 10 10 10 10 10 10 10 10
---- 
0 1 2 3 4 5 6 7 8 9 10 
11 12 13 14 15 16 17 18 19

I 'Интересно, ПОЧЕМУ значения массива (см. последние 2 строки) отличаются от 10?.
Полагаю, не отправляется правильный указатель, но, в этом случае, ГДЕ хранится массив с 10 ... 10 ?,это создано волшебным образом?

спасибо

Ответы [ 3 ]

1 голос
/ 11 ноября 2011

Кажется, что программа делает именно то, что вы запрограммировали.

Функция f1 устанавливает все значения на 10

 w[i][j]=10;

в других местах установите

w[i][j]=i*10 + j;
0 голосов
/ 05 марта 2013

Выход должен быть неправильным,

должно быть как:

0 1 2 3 4 5 6 7 8 9
10 11 12 13 14 15 16 17 18 19
0 голосов
/ 11 ноября 2011
for (int i=0;i<2;i++){
    for (int j=0;j<10;j++){
        w[i][j]=i*10 + j;
        printf("%d ",w[i][j]);
    }
    printf("\n");
}

Вы устанавливаете массив с помощью этой строки: w [i] [j] = i * 10 + j;

Переменная i равна 0 или 1 для вашего массива из 2 элементов, поэтому:

0*10 + 0 = 0... 
0*10 + 9 = 9...
1*10 + 0 = 10...
1*10 + 9 = 19

Это составляет весь ваш диапазон выходов в последнем наборе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...