У меня есть код:
#include <iostream>
#include <string>
using namespace std;
int main(){
char abc [20] = "Hello Hello Hi";
char* ptr = abc;
cout << (abc+3);
return 0;
}
Почему он печатается с третьего знака, а не просто с третьего?
-редактировать — тому, кто пометил его. это не то же самое, что prinf (), но концепция того же типа. я просто не знал нюансов
Чтобы понять почему, вам нужно немного понять арифметику указателей.
abc такой же как &abc [0] и (abc + 3) совпадают с &аЬс [3]
При этом cout печатает строку из заданного символа * в нулевой символ.
Следовательно, вы просто печатаете строку, которая начинается с третьего символа до конца строки. Если вы хотите напечатать только третий символ, вы можете разыменовать указатель на третий символ, как этот.
*(abc + 3)
char abc [20]
распадается на char*
, который фактически является строкой в стиле c. abc+3
остается указателем, просто смещенным от abc[0]
, так std::cout
будет по-прежнему печатать его как строку.
Потому что потоки имеют перегрузку для 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.