2016-01-17 2 views
0

Почему это не вызывает ошибку в строке 2?Основные указатели строк C++

char *p = "Hello"; 
p = "Bye"; 

*p является переменной, так p является адресом переменной *p. Пожалуйста, объясните мне, что происходит в вышеуказанном коде?

+2

"' p "- это адрес переменной' p'. - Возможно, вы захотите рассмотреть второй вариант этого предложения;) – Quentin

+0

Просьба уточнить поведение, которое вы ожидаете в соответствии с фактическим поведением. –

+0

Возможно, это поможет, если я скажу вам, что 'char * p =" Hello ";' точно так же, как 'char * p =" Hello ";' – texasflood

ответ

4

*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 является указателем, и адрес текстового литерала хранится в этом указателе.

2

Это не C++ String Pointer, это C-Strings. Он не выдает ошибку, потому что строковый литерал сам по себе является указателем на первый элемент. p является указателем, *p является первым элементом вас Строка

+0

Здесь нет игрового устройства, но строковые литералы - это массивы, не указатели. – Quentin

-2

В первом случае p присваивается адрес строки. Во втором случае p переназначает адрес другой строки EDIT. Строковые литералы не выделяются в стеке. Благодаря Q

+3

Строковые литералы не выделяются в стеке: они имеют статическое время жизни. – Quentin

+0

Спасибо Квентин. – prabindh

+2

Вместо того, чтобы иметь неправильное утверждение и править, говоря, что они неправы, почему бы не удалить неверные утверждения вообще !? – StoryTeller

0

Вот пример

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; 
} 

Проблема у вас есть р является переменной с указателем.

Смежные вопросы