Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > *pName and pName


Автор: GRON 26.12.2003, 15:28
Народ, просьба объяснить:
Если передать функции массив, допустим, f("Alpha"); , то

Код
void f(char *pName)
{
cout << pName << "\n";
}

Такой код выводит тот же массив:
Alpha

А такой
Код
void f(char *pName)
{
cout << *pName << "\n";
}

Выводит только А, т.е. только первую букву.
Почему?

Автор: shedon 26.12.2003, 15:36
Потому, что ты передаёшь указатель на первый символ массива. т.е. ты передаёшь указатель на указатель(двойной указатель)
тоже
Код

void f(char *pName)
{
cout << &pName[0] << "\n";
}

Автор: GRON 26.12.2003, 15:41
Код
void f(char *pName)
{
cout << pName << "\n";
}

А почему этот тогда выводит весь массив разом?

Автор: Anklav 26.12.2003, 18:30
Код

//ostream.h
ostream& operator<<(const char *);
inline  ostream& operator<<(const unsigned char *);
inline  ostream& operator<<(const signed char *);

Наверно эта функция порегружена для char * на вывод строки.

Автор: GRON 26.12.2003, 22:32
Все, я окончательно сформулировал вопрос:
Почему при запросе вывода ( cout << pName; ) переменной имеющей тип char*, выводится переменная типа char, да еще не одна, а сразу несколько?
AnklavСорри, но видимо, я настолько еще новичок - объясни, чем unsigned отличается от signed?
Спасибо всем.

Автор: <Spawn> 27.12.2003, 07:53
Цитата
чем unsigned отличается от signed?

Беззнаковый и знаковый соответственно типы. Т.е. signed char может принимать значения от - 128 до 127, а unsigned char от 0 до 255.

Автор: <Spawn> 27.12.2003, 08:11
Цитата
Почему при запросе вывода ( cout << pName; ) переменной имеющей тип char*, выводится переменная типа char, да еще не одна, а сразу несколько?


Потому что так, видимо, реализована работата метода класса. Так как char * это null-terminated стринг, то скорее всего, делается это в методе примерно так(абстрактно):

Код
for (; *outchar != 0; outchar++)
   out(*outchar)

Автор: GRON 27.12.2003, 17:19
Я так и подумал, т.е. он начинает выводить все подряд, что следует за адресом pName, пока не встретит либо 0, либо ничего.
Один только вопрос - чем отличается значения char от -128 до 127 от 0 до 255?
Спасибо.

Автор: <Spawn> 27.12.2003, 17:38
Цитата
Один только вопрос - чем отличается значения char от -128 до 127 от 0 до 255

практически ни чем. Что то, что другое занимают 1 байт. Но если ты пишешь unsigned то он интерпритируется как отрицательное число, иначе положительное. Как все это понимает компилятор? А очень просто если он "знает", что ты хочешь использовать отрицательные значения, то смотрит старший бит байта и если он равен 1, то число считается отрицательным. Например:

0000 0010 : 2
1000 0010 : -126

Автор: RomaX 27.12.2003, 17:44
Цитата
Один только вопрос - чем отличается значения char от -128 до 127 от 0 до 255?

Для знаковых чисел старший бит интерпретируется как знак: единица - как минус, ноль - как плюс. Счет идет
127 - 01111110
128 - 01111111
0 -10000000
-1 - 10000001
-2 - 10000010 и т.д.
У беззнаковых же старший бит не интерпретируется как знаковый, т.е. за 128 идет 129.[QUOTE]

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)