Кто-нибудь может объяснить, как его печать выводится как «чернила» - PullRequest
3 голосов
/ 17 марта 2010

Я новичок в указателях на C. Я знаю основные понятия. В приведенном ниже коде, почему он печатает «чернила» в качестве вывода?

#include<stdio.h>


main()
{
    static char *s[]={"black","white","pink","violet"};

    char **ptr[]={s+3,s+2,s+1,s},***p;

    p=ptr;

    ++p;

    printf("%s",**p+1);
}

Спасибо

Ответы [ 4 ]

14 голосов
/ 17 марта 2010

Давайте проследим это:

ptr = {pointer to "violet", pointer to "pink", pointer to "white", pointer to "black"}

p = ptr --> *p = pointer to "violet"

++p -->     *p = pointer to "pink"

Это означает, что:

*p = {'p','i','n','k','\0'}

Что означает:

**p = 'p'
**p + 1 = 'i'

поэтому **p + 1 - это указатель на эту строку: {'i', 'n', 'k', '\0'}, что просто "ink".

4 голосов
/ 17 марта 2010

s - это массив char * (представляющий строки).

ptr - это массив указателей на указатели (указывающих на значения s, которые являются указателями на строки)

p установлен для указания на ptr[0] (который является указателем на s[3] или "фиолетовый")

p увеличивается для указания на ptr[1],который указывает на s[2] или "розовый"

В операторе printf p разыменовывается дважды.Первое значение deref - это указатель на s[2], второе значение deref возвращает значение s[2] - "pink".+1 переводит указатель на начало «розового» на один символ, поэтому печать отсюда до конца строки даст вам «чернила».

0 голосов
/ 17 марта 2010

статический символ * С [] = { "черный", "белый", "розовый", "фиолетовый"};

     In the above statement you are initialize. 

     char **ptr[]={s+3,s+2,s+1,s}

       In the above statement you are assign pointer s value to ptr

значение. И объявить тройной указатель.

    p=ptr; 
    In the above statement you assign the double pointer address to

тройной указатель.

   ++p; 

   In the above statement you increment the triple pointer value. So

тогда это указывает на "розовый".

   But you are print the **p+1. That time it will print only "ink".

Если вы напечатаете ** (p + 1), тогда напечатает «белый». Потому что в инициализация двойного указателя у вас инициализировать "s + 2". Так что время будет указывать на «белых».

0 голосов
/ 17 марта 2010

Я бы посоветовал вам вернуться назад к тому, что, как вы знаете, было напечатано («чернила» в «розовом») и посмотреть, куда должны указывать различные переменные.

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

...