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