Получение адреса любого элемента массива символов

Я создаю массив символов. Так const char *str = "Hello"; , так char str[] = { 'H', 'e', 'l', 'l', 'o', '\0' }; или так char str[] = "Hello"; Как получить адрес любого элемента массива? Чтобы получить адрес нулевого элемента я пробывал cout << &str << endl;, но получаю я, наверное, адрес, где лежит указатель, или нет? Для первого варианта объявления массива можно сказать, что я получаю адрес указателя, а для остальных нет. С массивами символов всё не так, как с обычными статическими или динамическими, какие-то другие записи. Когда я записываю cout << &str[1] << endl; то получаю массив, без какой-либо буквы. Это, видимо, какая-то ложная запись, которая не работает. Решение вопроса предлагать только на c++.


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

Автор решения: HolyBlackCat

Для первого варианта объявления массива можно сказать, что я получаю адрес указателя

В первом варианте вы объявляете указатель, не массив. Поэтому да, адрес указателя.

Чтобы получить адрес нулевого элемента я пробывал cout << &str << endl;, но получаю я, наверное, адрес, где лежит указатель, или нет?

Нет, в случаях (2) и (3) вы получаете адрес всего массива. & - одна из немногих вещей, которая не вызывает неявного преобразования массива в указатель на первый элемент.

Этот адрес своим значением совпадает с адресом первого элемента, но отличается от него типом: char (*)[6] ("указатель на массив размера 6 из char") против char * ("указатель на char").

С массивами символов всё не так, как с обычными статическими или динамическими, какие-то другие записи. Когда я записываю cout << &str[1] << endl; то получаю массив, без какой-либо буквы.

Дело не в массивах символов, они такие же как любые другие массивы. Дело в cout, который сделан так, что считает char * указателем на начало строки и печатает как строку.

Это, видимо, какая-то ложная запись, которая не работает

Нуу, она работает, в том смысле что она печатает строку начиная с n-ого символа. Если это то, что вам нужно, то почему нет.

Как подсказали в комментариях, чтобы отучить cout печатать char * как строку, можно сделать std::cout << (void*)&str[1] << '\n';.

Как эта запись работает? Именно (void*)

Она меняет тип указателя с char * на void *, а значение не меняет. Это называется "явное приведение типа", или "каст" ("cast", а точнее "C-style cast").

Такой тип cout уже не считает строкой, и печатает как число.

Есть ли ещё какие-нибудь варианты записи?

static_cast<const void *>(&str[1]), reinterpret_cast<const void *>(&str[1]). Второй вариант мне нравится больше.

→ Ссылка