Что указывает на John в примере?

Смотрите тут char* gg[] = {"John", "Maria"}; я хочу понять, если это массив указателей на строку то что указывает на John? Может быть на John указывает адрес её первого символа т.е J и gg[i] хранит адрес символа J, который указывает на строку John?


Ответы (1 шт):

Автор решения: Stanislav Volodarskiy

Во первых, вы написали нехороший код. Литерал "John" имеет тип const char*, ему не место в массиве char*. Компиляторы C допускают такой код только из соображений обратной совместимости:

#include <stdio.h>

int main() {
    char* gg[] = {"John", "Maria"};
}
$ gcc -Wwrite-strings example.c 
temp.c: In function ‘main’:
temp.c:8:19: warning: initialization discards ‘const’ qualifier from pointer target type [-Wdiscarded-qualifiers]
    8 |     char* gg[] = {"John", "Maria"};
      |                   ^~~~~~
temp.c:8:27: warning: initialization discards ‘const’ qualifier from pointer target type [-Wdiscarded-qualifiers]
    8 |     char* gg[] = {"John", "Maria"};
      |                           ^~~~~~~

Под капотом компилятор выделяет память под два массива символов. Они неизменямые:

const char john_array[5] = {'J', 'o', 'h', 'n', '\0'};
const char maria_array[6] = {'M', 'a', 'r', 'i', 'a', '\0'};

Каждому массиву сопоставляется указатель на первый символ массива:

const char *john_pointer = &john_array[0];
const char *maria_pointer = &maria_array[0];

Из указателей составляется массив gg:

const char* gg[] = {john_pointer, maria_pointer };
→ Ссылка