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
это правильно