Другие языки программирования и технологии

[C++] char && char* && char[ ]

Не могу разобраться. К примеру, вот такой фрагмент кода:

char* x = "Hello";

Что такое char*? Какой-то особый тип данных? Окей, по синтаксису x -- указатель на значение "Hello".
Фрагмент кода:

cout << "The value of x: " << x << endl;

Выводит именно Hello, а не адрес памяти литерала.. . Блин, совсем запутался :D
Ну, а если попытаться получить значение литерала по указателю, который запоминает значение литерала :D, вот так:
cout << *x;
...то на выходе получаем первый символ строкового литерала -- "H" -- как будто x -- это массив.. .

ЗЫ: Если пишем как-то так, то это ну прям понятно )))
char s[ ] = "Hello";
просто создается символьный массив, а вот с первым вариантом никак не разберусь...
А)
Антон )))
496
char* x = "Hello"; и char s[ ] = "Hello"; - считай, одно и то же.
x и s- указатели на char, длина определяется из пост условия.
cout << *x; - вывести значение по адресу x. можешь попробовать cout << *(x+1); и т. д.
cout << "The value of x: " << x << endl; выводит Hello потому что ты и просишь его вывести строку.
если нужен адрес - можешь, например, воспользоваться printf( "%p", x )

давай лучше через почту
Ибрагим Велиев
Ибрагим Велиев
38 447
Лучший ответ
Здесь ощущается разница.. .

#include <iostream>
using namespace std;
int main() {
char arr[] = "Hello";
char * ptr = "Hello";
int size_arr, size_ptr;
size_arr = sizeof(arr);
size_ptr = sizeof(ptr);
cout << "size_arr = " << size_arr << endl << "size_ptr = " << size_ptr;
cin.get();
return 0;
}

Во втором случае ничего не известно о размере строки. Попытка вычислить выдаёт размер самого указателя, который является int, хотя и указывает на char
Гутник Игорь
Гутник Игорь
50 363
Запомни. Имя массива (этикетка) - это всегда указатель на первый элемент массива и не важно какой будет тип.

Что такое строка ?? -это массив символов. Ты можешь объявить либо указатель на строку, либо массив символов, суть одна. т. к повторю имя массива - это указатель на первый элемент.

Почему же в первом варианте у тебя возникает ошибка при присваивании элементу строки. Это зависит от реализации компилятора, когда ты объявляешь указатель на строку, он помещает эти данные в неизменяемую область памяти. Фактически у тебя получается константная строка.

Поэтому предподчительней второй способ.