Вывод двумерного массива должен быть понят - PullRequest
1 голос
/ 16 апреля 2020

Это код https://ide.geeksforgeeks.org/8bYOzDDC9U для запуска этого

#include <stdio.h>

char *c[] = {"GeksQuiz", "MCQ", "TEST", "QUIZ"};
char **cp[] = {c+3, c+2, c+1, c};
char ***cpp = cp;

int main()
{
    cpp++;
    printf("%s", cpp[0][0]);  // TEST
    printf("%s ", cpp[-1][-1]); // TEST
    return 0;
}

Вывод обоих printf () - TEST. Почему это так? Когда я делаю cpp ++, указатель перемещается в c + 2. Так что я понимаю, что cpp [0] [0] будет в начале "TEST", и поэтому он печатает TEST. Может кто-нибудь объяснить мне для cpp [-1 [-1]?

Ответы [ 2 ]

2 голосов
/ 16 апреля 2020

char ***cpp = cp; инициализирует cpp для указания на первый элемент cp, то есть cp[0].

После cpp++, cpp указывает на cp[1]. Тогда cpp[-1] относится к cp[0].

cp[0] содержит c+3, что является указателем на c[3]. Таким образом, cp[0][-1] относится к c[2].

c[2] содержит "Test", в том смысле, что это указатель на первый элемент "Test", поэтому при печати он печатает "Test".

1 голос
/ 16 апреля 2020

Первоначально указатель cpp указывает на первый элемент массива cp.

char ***cpp = cp;

После этого оператора

cpp++;

указатель cpp указывает на второй элемент массива cp. Таким образом, это выражение

cpp[-1]

дает первый элемент массива cp

Обратите внимание, что выражение cpp[-1] вычисляется как

*( cpp - 1 )

Таким образом на самом деле эти два оператора

cpp++;

и

cpp[-1]

могут рассматриваться как *( ( cpp += 1 ) - 1 ), который имеет одинаковый эффект, если писать cpp[0] без увеличения указателя cpp.

Это (первый) элемент массива cp. содержит значение c+3, которое является указателем на последний элемент массива c.

Таким образом, cpp[-1][-1] задает элемент перед последним элементом массива c, который является указателем на первый символ строкового литерала "TEST".

Таким образом строковый литерал выводится этим вызовом printf

printf("%s ", cpp[-1][-1])

Также имейте в виду, что в представленном коде нет ни 2- массив d. Все массивы c и cp являются одномерными массивами указателей.

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