Почему это не вызывает ошибку в строке 2?Основные указатели строк C++
char *p = "Hello";
p = "Bye";
*p
является переменной, так p
является адресом переменной *p
. Пожалуйста, объясните мне, что происходит в вышеуказанном коде?
Почему это не вызывает ошибку в строке 2?Основные указатели строк C++
char *p = "Hello";
p = "Bye";
*p
является переменной, так p
является адресом переменной *p
. Пожалуйста, объясните мне, что происходит в вышеуказанном коде?
*p
не «переменная». p
является переменной и является указателем. C и C++ имеют синтаксис описания нечетного вида, в котором вы объявляете переменную с тем же синтаксисом, который используется для доступа к переменной.
char *p;
В этой декларации мы объявляющий p
, не *p
но объявляющий p
быть вещью p
необходимо будет для *p
быть char
char *p = "Hello";
Теперь это может быть еще один шаг меньше интуитивно, потому что вещь справа от =
- это начальное значение для p
, а не начальное значение для *p
. Вот как работают C и C++, и их легко привыкнуть и понять, даже если значения левой и правой сторон изначально кажутся противоречивыми.
Так что ваш пример:
char *p = "Hello";
p = "Bye";
Я могу понять, почему кто-то, кто не знает, C или C++ могут подумать, есть другой уровень косвенности для использования p
на первой линии против второго , Но на самом деле на обеих линиях p
является указателем, и адрес текстового литерала хранится в этом указателе.
Это не C++ String Pointer, это C-Strings. Он не выдает ошибку, потому что строковый литерал сам по себе является указателем на первый элемент. p
является указателем, *p
является первым элементом вас Строка
Здесь нет игрового устройства, но строковые литералы - это массивы, не указатели. – Quentin
В первом случае p присваивается адрес строки. Во втором случае p переназначает адрес другой строки EDIT. Строковые литералы не выделяются в стеке. Благодаря Q
Строковые литералы не выделяются в стеке: они имеют статическое время жизни. – Quentin
Спасибо Квентин. – prabindh
Вместо того, чтобы иметь неправильное утверждение и править, говоря, что они неправы, почему бы не удалить неверные утверждения вообще !? – StoryTeller
Вот пример
int firstvalue = 5, secondvalue = 15;
int * p1, * p2;
p1 = &firstvalue; // p1 = address of firstvalue
p2 = &secondvalue; // p2 = address of secondvalue
*p1 = 10; // value pointed to by p1 = 10
*p2 = *p1; // value pointed to by p2 = value pointed to by p1
p1 = p2; // p1 = p2 (value of pointer is copied)
*p1 = 20; // value pointed to by p1 = 20
cout << "firstvalue is " << firstvalue << '\n';
cout << "secondvalue is " << secondvalue << '\n';
return 0;
}
Проблема у вас есть р является переменной с указателем.
"' p "- это адрес переменной' p'. - Возможно, вы захотите рассмотреть второй вариант этого предложения;) – Quentin
Просьба уточнить поведение, которое вы ожидаете в соответствии с фактическим поведением. –
Возможно, это поможет, если я скажу вам, что 'char * p =" Hello ";' точно так же, как 'char * p =" Hello ";' – texasflood