Указатель на двумерный массив

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

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

1 ответ

Решение

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

Тип (ptr+1) является char (*)[4],
Тип *(ptr+1) является char [4]который разлагается на char*,
Тип *(ptr+1)+2 является char*,

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

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

С помощью

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

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

Другие вопросы по тегам