символьные указатели в C ++ - PullRequest
5 голосов
/ 11 марта 2011

Привет, ребята У меня есть сомнения по поводу указателей символов в C ++. Всякий раз, когда мы создаем символьный указатель в c ++ char * p = "Как дела", p должен содержать адрес ячейки памяти, который содержит значение "Как дела". Однако я озадачен одним кодом и выводом. Почему cout<<p возвращает всю строку? Он должен давать значение адреса памяти. Во-вторых, почему cout<<*p дает только первый символ строки? Заранее спасибо! Код:

#include <iostream>
using namespace std;

int main () {

const char *str = "how are you\n";
int i[]={1,2,3};


 cout << str << endl;   // << is defined on char *.
 cout << i << endl;
 cout << *str << endl;

}

ВЫВОД:

how are you

0xbfac1eb0

h

Ответы [ 4 ]

6 голосов
/ 11 марта 2011

Если вы хотите напечатать адрес, вы должны привести char* к void*, как

const char *str = "how are you\n"; 
cout << (void*) str << endl; 

В отсутствие приведения cout видит str как const char* (что на самом деле так и есть), и поэтому cout думает, что вы собираетесь печатать строку символов с нулевым символом в конце!

Подумайте: если вы хотите, чтобы coud << str напечатал адрес, как бы вы напечатали саму строку?

-

В любом случае вот более подробное объяснение:

operator<< перегружен для char*, а также void*:

//first overload : free standing function
basic_ostream<char, _Traits>& operator<<(basic_ostream<char, _Traits>& _Ostr, const char *_Val);

//second overload : a member of basic_ostream<>
_Myt& operator<<(const void *_Val);

В отсутствие приведения вызывается первая перегрузка, но когда вы приводите к void*, вызывается вторая перегрузка!

5 голосов
/ 11 марта 2011

Это связано с перегрузкой оператора.

оператор << </strong> перегружен для вывода строки, на которую указывает символьный указатель.

Аналогично, с * p вы получите первый символ, следовательно, вы получите первый символ в качестве вывода.

2 голосов
/ 11 марта 2011

cout << str << endl; печатает "как дела", потому что str - это char *, что рассматривается как строка.

cout << i << endl; печатает 0xbfac1eb0, потому что i - это int [], который рассматривается как int*, который обрабатывается как void*, который является указателем.

cout << *str << endl' prints "h", поскольку *str является char со значением 'h'.

1 голос
/ 11 марта 2011

Строка C - это просто набор байтов, оканчивающийся нулевым байтом (это соглашение). Вы также можете думать об этом как о массиве байтов / символов. Если вы делаете char *str = "foobar";, компилятор резервирует некоторую память для этих байтов, а затем назначает ячейку памяти первого байта / символа на str.

Таким образом, если вы разыменуете указатель str, вы получите байт в этом месте, который оказывается первым символом вашей строки. Если вы сделаете *(str + 1), вы получите второй, что точно так же, как и написание str[1].

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