C Множественное косвенное обращение

В настоящее время я смотрю курс указателей в C, и у меня есть вопрос о множественной косвенности. Я понял, что такое множественное косвенное обращение, и это нормально, но я запустил кусок кода и попытался сделать то же самое, но немного по-другому, но он не работает, и я понял, почему? У меня вопрос о приведении указателя в строке 32, почему это не работает, когда я использую его так: printf("Value pointed to by gp is:%s\n",(char *)gp); Вот код:

      #include <stdio.h>

int data[3];
char *words[3];

int main(int argc, char **argv)
{
        void *gp;

        char *word = "rijec";
        printf("%s\n",word);

        for(int i = 0; i < 3;i++)
        {
                data[i] = i;
        }
        words[0] = "zero";
        words[1] = "one";
        words[2] = "two";

        gp = data;
        printf("\nAddress of array data is:%p\n",gp);
        for(int i = 0; i < 3; i++)
        {
                printf("Value pointed to by gp is %d\n",*(int *)gp);
                gp = (int*)gp+1;
        }
        gp=words;
        printf("\nAddress of array of strings words is:%p\n",gp);
        for(int i = 0;i < 3; i++)
        {
                printf("Value pointed to by gp is:%s\n",*(char **)gp);
                gp  = (char **)gp+1;
        }

        return 0;
}

2 ответа

На строке 32 gpсодержит адрес, по которому хранится массив (поскольку слова массива распадаются на указатель во время присваивания). Массив wordsсостоит из 3-х указателей. Когда вы бросаете это на char * вы говорите компилятору обращаться с этим массивом, как если бы каждый из его элементов был charа не указатель. Вам нужно разыменовать указатель, чтобы получить фактическую строку.

Когда ты делаешь

      gp=words;

преобразуется в указатель на первый элемент массива. Первый элемент массива - это char*. Как следствие, wordsпреобразуется в. Так gp будет содержать указатель типа char**

Вот почему это:

      printf("Value pointed to by gp is:%s\n",(char *)gp);
                                        ^^^^^^^^
                                        wrong cast

это не так

и это:

      printf("Value pointed to by gp is:%s\n",*(char **)gp);
                                        ^ ^^^^^^^^
                                        |  correct cast
                                        |
                                        correct dereferencing

это правильно

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