C ++指针 - C - 样式字符串

时间:2015-10-21 20:35:40

标签: c++ pointers visual-c++

我是C ++的新手,当我读到关于指针的时候我有点困惑:

char str[] = "Alex"
char *ptr
ptr = str
cout << ptr

这给了“Alex”字符串本身,而不是内存位置,* ptr会给你字母“A”。有人会告诉我为什么会这样吗?

另外,除此之外。当我尝试打印时 cout << *ptr 它给了我第一个字符的地址。为什么这个?,我期待第一个值

4 个答案:

答案 0 :(得分:3)

operator<<的重载需要ostreamcout}类型和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