Почему мой указатель на символ получает только первый символ в нем? - PullRequest
1 голос
/ 10 февраля 2020

Я инициализировал char и указатель, а затем указал его на char. Но я обнаружил, что только первый символ в символе был передан в указатель. Как это могло произойти? Цени любой совет!

    char p[]="This is a long char.";
    std::cout<<sizeof(p)<<"\n";
    char *ptr=p;
    std::cout<<*ptr<<"\n";

Получил:

21
T
Program ended with exit code: 0

При проверке значения переменных я заметил, что:

ptr=(char *) "This is a long char."
*ptr=(char) 'T'

Почему ptr содержит целое символ, но содержание в нем только первый символ? Разве это не противоположно тому, что мы называем указателем? Действительно запутался ...

Ответы [ 3 ]

2 голосов
/ 10 февраля 2020

Когда вы сказали:

std::cout<<*ptr...

вы разыменовали ptr, что дает вам (первый) символ, на который указывает ptr.

Ответ flyCode показывает, как напечатать всю строку.

2 голосов
/ 10 февраля 2020

В C ++ массив похож на несколько переменных, сгруппированных вместе, поэтому у каждой из них есть адрес памяти, но они расположены один за другим.

Итак, указатель указывает на адрес первого элемента , а остальные элементы находятся в адресах сразу после этого в следующем порядке.

Когда вы используете оператор * для указателя, он ссылается на содержимое адреса памяти, на который указывает указатель.

Если вы хотите получить доступ к другому элементу массива, используя это, вы бы использовали *(ptr + 5) для смещения адреса памяти.

Когда вы используете только имя переменной, язык просто смещает вас и получает все содержимое массива. Указатель не знает длину массива, но может найти его конец, потому что массивы char всегда заканчиваются нулевым символом (\ 0).

1 голос
/ 10 февраля 2020

запустил ваш код в repl и изменил его на приведенный ниже код: D

  char p[]="This is a long char.";
  std::cout<<sizeof(p)<<"\n";
  char *ptr=p;
  std::cout<<ptr<<"\n"; //notice no *

Я рекомендую использовать std :: string вместо c -strings, если у вас нет спецификаций c нужно для них:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...