Разыменование массива указателей - PullRequest
0 голосов
/ 20 мая 2019

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

Я попытался напечатать **names, и затем я получил то, что ожидал получить от *names -- 'C'.Однако *names дает мне 'D'.

#include <stdio.h>


int main(void)
{
   char *names[] = {"Carl", "David", "Gibson", "Long", "Paul"};
   printf("%c\n", *names);

   return 0;
}

Консоль выводит 'D'.Я не уверен, почему полученный char из *names не является первой буквой первого элемента, 'C'.

Ответы [ 2 ]

3 голосов
/ 20 мая 2019

Когда вы компилируете этот код, GCC выдаст вам следующее:

test.c:5:12: warning: format ‘%c’ expects argument of type ‘int’, but argument 2 has type ‘char *’ [-Wformat=]
   printf("%c\n", *names);
           ~^     ~~~~~~
           %s

Таким образом, вы в основном пытаетесь напечатать первый символ имени, но вместо того, чтобы передать char какаргумент, вы передаете указатель на символ.Что вы можете сделать, это:

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

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

Кроме того, использование **names аналогично использованию *names[0]

3 голосов
/ 20 мая 2019

Это неопределенное поведение, и вывод зависит от компилятора.
Когда я запускаю это с gcc, вывод не производится.Использование **names печатает 'C'.
Неопределенное поведение из-за неправильного спецификатора формата.Вы используете %c, но *names указывает на первый элемент в массиве, то есть массив символов, хранящий «Carl».
Используйте спецификатор формата %s для печати строк.

printf("%c\n", *names);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...