2015-05-15 6 views
-1

У меня есть некоторый код:характер печати путаницы

#include <iostream> 
#include <string> 
using namespace std; 
int main(){ 
    char abc [20] = "Hello Hello Hi"; 
    char* ptr = abc; 
    cout << (abc+3); 
return 0; 

}

Почему печать из третьего символа и не просто третий символ?

-edit- тому, кто помечал его. это не то же самое, что и prinf(), но такой же тип понятия. я просто не знал нюансов

+3

'cout << abc;' также не печатает первый (0-й) символ, но вся строка ... Пропуск 3 байта не меняет этого поведения. – deviantfan

+1

Почему у меня есть символ 'char * ptr = abc'? – AndyG

+0

Возможный дубликат [printf() печатает весь массив] (http://stackoverflow.com/questions/16962144/printf-prints-whole-array) – AndyG

ответ

6

Чтобы понять, почему, вам нужно понять немного арифметики указателя.

аЬса такого же, как & аЬса [0] и (абакавир + 3) такой же, как & аЬса [3]

, как говорится, соиЬ печатает строку из заданного полукокса * до нулевого символа ,

Таким образом, вы в основном просто печатаете строку, которая начинается с третьего символа до конца строки. Если вы хотите напечатать только третий символ, вы можете разыменовать указатель на третий символ, как это.

*(abc + 3) 
+0

спасибо @ andrew-malta, что имеет смысл. единственное, что я не знал, это то, что он всегда печатает строку из заданного char * в nul char – aaaa

4

char abc [20] распадается на char*, что фактически является строкой c-стиля. abc+3 остается указателем, только смещенным от abc[0], поэтому std::cout по-прежнему печатает его как строку.

2

Поскольку потоки имеют перегрузку для char*, который рассматривает входной сигнал как C-String. Операторы потока будут печатать все до нулевого терминатора (если они представлены char*).

Если вы хотите напечатать один символ, вам необходимо преобразовать ваше выражение в char не char*.

cout << (abc+3);  // Type of expression is char* 

cout << (*(abc+3)); // Type of expression is char 
        // This prints a signle character.