我是C ++的新手,当我读到关于指针的时候我有点困惑:
char str[] = "Alex"
char *ptr
ptr = str
cout << ptr
这给了“Alex”字符串本身,而不是内存位置,* ptr会给你字母“A”。有人会告诉我为什么会这样吗?
另外,除此之外。当我尝试打印时
cout << *ptr
它给了我第一个字符的地址。为什么这个?,我期待第一个值
答案 0 :(得分:3)
operator<<
的重载需要ostream
(cout
}类型和const char*
。
该重载将const char*
参数视为空终止的C字符串,并打印该指针指向的字符,直到找到终止空字符。
请注意,传递一个char
指针,该指针没有指向空终止的char
序列,会调用未定义的行为。
为了在您只想输出内存地址时绕过此行为,首先将指针强制转换为void*
:
cout << static_cast<void*>(ptr); // outputs the address stored in 'ptr'
答案 1 :(得分:2)
C样式字符串只是char
的C样式数组,所有语义都与C样式数组相关联。
iostream
是特殊的,在给出char
指针时表现不同;如果您想打印地址,请先将其转换为void*
。
答案 2 :(得分:2)
这是因为在c ++中你可以重载运算符,如下所示:
ostream& operator<<(ostream& os, const char* p)
{
while (*p) cout<<*p++;
}
因为char数组是一种常见的字符串类型,所以它是用标准语言完成的。
答案 3 :(得分:0)
因为C / C ++中的字符串以'\0'
结尾。输出将运行到下一个指针,直到它到达指向'\0'
的指针。
ptr + 0 == 'A';
ptr + 1 == 'l';
ptr + 2 == 'e';
ptr + 3 == 'x';
ptr + 4 == '\0'; // stop, end of output