2015-07-12 2 views
-6

Я не могу понять логику того, как вывод следующего кода C, как он появляется.Как вычислить вывод следующего кода в C?

#include <stdio.h> 

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

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

Выходной сигнал выходит как:

TEST sQuiz Z CQ 
+1

Откройте терминал, используйте 'cd' изменить каталог текущего рабочего каталога, введите в терминале' Gcc -stdc = 99 programfile.c', нажмите 'Enter', а затем введите' ./a. и снова нажмите клавишу Enter. Смотрите вывод и сообщите нам. – haccks

+0

@rochak gupta Ожидается выход. :) –

+0

@ VladfromMoscow Вы могли бы объяснить, как это было достигнуто? –

ответ

0

cpp является указателем на первый элемент массива

char **cp[] = {c+3, c+2, c+1, c}; 

Таким образом, после нанесения приращением

++cpp 

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

* ++ cpp - этот второй элемент и эквивалентен cp[1]. Его значение (c+2) является указателем на третий элемент массива c

char *c[] = {"GeksQuiz", "MCQ", "TEST", "QUIZ"}; 

Так **++cpp этот третий элемент массива c и утверждение

printf("%s ", **++cpp); 

выведет строковый литерал адрес которого хранится в этом элементе, который является

TEST 

Второе применение приращения указателя cpp (++cpp) приводит к тому, что указатель укажет на третий элемент массива cp, который является элементом, который имеет значение c+1 Выражение *++cpp дает это значение. c+1 является указателем на второй элемент attay c Применяя operator --, мы получаем указатель на первый элемент массива c Выражение *--*++cpp дает этот элемент массива c, который является адресом строкового литерала "GeksQuiz". Добавив 3 к этому адресу *--*++cpp+3, вы получите указатель, указывающий на символ 's' в этом строковом литерале. Так заявление

printf("%s ", *--*++cpp+3); 

будет выводить эту строку литерал, начиная с этого символа

sQuiz 

Как сейчас указатель cpp указывает на третий элемент массива ф, то выражение cpp[-2] дает первый элемент ARRA cp, что содержит указатель c+3 Выражение *cpp[-2] дает этот указатель, который является четырехгранным элементом массива c, а выражение *cpp[-2]+3 дает свой четвертый символ cter, который является символом 'Z' строкового литерала "QUIZ".

Так заявление

printf("%s ", *cpp[-2]+3); 

выводит эту строку литерал, начиная с символа 'Z', который сам по себе характер.

Z 

Выражение cpp[-1] дает второй элемент массива cp, который c+2. Выражение cpp[-1][-1] эквивалентно *((c + 2) - 1), что в свою очередь эквивалентно *(c + 1) и дает второй элемент массива c, который является адресом первого символа строкового литерала "MCQ" Выражение cpp[-1][-1]+1 является указателем на второй символ строкового литерала, который равен 'C' ,

Так заявление

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

будет выводить эту строку буквальным starrting от этого символа

CQ 

Таким образом, выход программы

TEST sQuiz Z CQ 
+0

большое спасибо! я плохо царапал себе голову за это! –

+0

Отличное объяснение сэр. – Raman

+0

@rochak gupta Нет вообще. Вы должны понимать, что если у вас есть массив T a [] = {/*...*/}; то объявление T * p = a; объявляет указатель p, который указывает на первый элемент массива. p + 1 указывает на второй элемент, p + 2 указывает на третий элемент и так далее. Таким образом, p [0] является первым элементом массива p [1], является вторым элементом массива и т. Д. Или, например, (++ p) [- 1] - это первый элемент массива a. –

0
  • **++cpp --->*(*(++cpp)) --->*(c+2) ---> "TEST"

    Теперь CPP указует на C +-

  • Поэтому *--*++cpp+3 --->(*(--(*(++cpp))))+3 --->(*(--(c+1))+3 ->(*c)+3 -> «sQuiz "

    Теперь CPP указывает на C + 1

  • Поэтому *cpp[-2]+3 --->*(c+3)+3 ---> "Z"

    каст до сих пор указывает на с +1

  • Поэтому cpp[-1][-1]+1 --->*(*(cpp-1)-1)+1 --->*(c+2-1)+1 --->*(c+1)+1 ---> "CQ"

    Надежда, что делает вещи ясно.

Смежные вопросы