Указатель на двумерный массив - PullRequest
0 голосов
/ 29 августа 2018

Учитывая следующий код:

int main()
{
    static char wer[3][4] = {"bag","let","bud"};
    char (*ptr)[4] = wer;

    putchar(*(*(ptr+1)+2));
    putchar(*(wer[1]+2));
    putchar(*(ptr+1)+2);

    return 0;
}

первый и второй оператор putchar () указывают на 1-й элемент 1-й строки, т.е. e (с учетом 0 в качестве базового местоположения), тогда как в 3-м операторе putchar () он показывает значение мусора.
Но, как говорится в утверждении, (*(ptr+1)) явно означает указание на 2-й ряд. Почему так происходит?
Это из-за какой-то нормы putchar(), или я заканчиваю концепцию указателя?

1 Ответ

0 голосов
/ 29 августа 2018

Вы передаете неправильный тип на putchar в последней строке.

Тип (ptr+1) равен char (*)[4].
Тип *(ptr+1) равен char [4], который уменьшается до char*.
Тип *(ptr+1)+2 является char*.

Указатель преобразуется в какой-то странный int, который объясняет вывод - или мусор, как вы выразились более четко.

В случае сомнений лучше упростить ваш код, чем задаться вопросом, что происходит.

Использование

char c = *(ptr+1)+2;
putchar(c);

мог бы выявить проблему раньше.

...