статический массив символов в Си, инициализированный строками - PullRequest
0 голосов
/ 26 октября 2018

я пытаюсь обернуть голову фрагментом кода, который мы получили в нашей лекции по Си, но я не могу понять, что он делает.

Вот код:

int 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); 
    return 0; 
}

Приведенный выше код печатает «чернила», но как это работает?

Попытка

printf("s: %c\n",*s[0]);

дает мне 'b', *s[1] возвращает 'w', *s[2] возвращает 'p' и так далее. Таким образом, *s в основном возвращает первую букву строк, с которыми он был инициализирован. Попытка

printf("s: %c\n",**ptr[0]);

возвращает v, поэтому *s выглядит примерно так:

{b,w,p,v}; 

Это, однако, не подтверждается sizeof(s), возвращающим 16, а не 4.

Итак, мой вопрос: что здесь происходит? Где хранятся остальные персонажи?

1 Ответ

0 голосов
/ 26 октября 2018

вы делаете

printf("s: %c\n",*s[0])  // this prints the character 'b'

Если вы используете %s, вы получите всю строку

printf("s: %s\n",s[0])

Строковое объяснение кода ниже

static char *s[] = {"black", "white", "pink", "violet"};  
                         // Here s is an array of pointers to char. 
                         // s[0] will point to "black", s[1] will point to "white" etc.
char **ptr[] = {s+3, s+2, s+1, s}, ***p;  
                        //ptr is an array of pointer to pointer to char.  
                        // ptr[0] will be equal to s+3, i.e. &s[3].
                        // ptr[1] will be &s[2]
                        // p is a pointer to pointer to a pointer. (triple pointer)
p = ptr;                // p is set as the base addr of ptr.
++p;                    // p is incremented, i.e. it points to next element of ptr, i.e. ptr[1]
printf("%s", **p+1);    // This is equivalent to (**p) +1
                        // p = &s[2]. therefore
                        // *p = s[2]
                        // **p = *(s[2]) --> **p points to the `p` character in pink
                        // **p +1 will point to the `i` character in `pink'. That is what is printed.
return 0; 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...