2014-09-20 104 views
0

之后的所有元素要重新创建我的这个小问题,使用此代码(是的,它bruteforced并且可以精简下来):C++指针,指向字符数组特定元素返回指定一个

char hello[] = "John"; 
char *ptr1 = &hello[0]; 
char *ptr2 = &hello[1]; 
char *ptr3 = &hello[2]; 
char *ptr4 = &hello[3]; 
std::cout << ptr1 << "$"; 
std::cout << ptr2 << "$"; 
std::cout << ptr3 << "$"; 
std::cout << ptr4 << "$"; 

,你可能会看到尝试此代码后,它返回以下内容:

​​

我不知道为什么它需要指定的所有元素之后。

任何帮助?

回答

1

这是因为你正在打印指针,而不是它指向的东西。并且C程序中的指针通常指向char[]的开始,其代表'\0'终止的字符串。这就是为什么std::ostream(其中cout是一个实例)有一个重载的<<运算符,它输出整个字符串,直到结束符。

要先打印只是字符,取消引用指针:

std::cout << *ptr1 << "$"; 

你也可以使用引用来代替,该在很大程度上视为该数值本身的替代品:通过

char &ptr1 = hello[0]; 
1

ptr1ptr4也是指向字符的指针,因此<<会将它们视为字符串,并将它们打印出来,从而为您提供所见。

如果你只是想在每个位置上的字符,该格式的行:

char ch1 = hello[0]; 

将工作,这将改变输出到:

std::cout << *ptr1 << "$"; 
+0

刚看到托马斯的时候看到了你的答案。感谢您及时的回复。 – Code0 2014-09-20 06:46:24

0

,如果你想在打印值特定地址然后:

std::cout << *ptr1 << "$"; 
std::cout << *ptr2 << "$"; 
std::cout << *ptr3 << "$"; 
std::cout << *ptr4 << "$"; 
0

我不完全确定,但如果它cout收到一个字符指针,它会pri nt,直到它到达内存空白为止(C风格的字符串),如果你只是想打印一个字符,你应该只打印变量的内容,这意味着只传递内容而不是内存位置。

1

你的问题似乎是基于一些完全没有根据的预期。看起来您希望代码为每个cout << ...行打印一个字符。但你为什么期望这样做呢?您在代码中发送给cout的内容其实是char *指针。你为什么期望cout解除引用那为你指针和打印字符?预期的正常情况是在输出(地址)中看到指针值,而不是字符值。

所以,你真的应该问的问题不是“为什么它从我的数组打印几个字符?”。你应该真正问的问题是“为什么它会打印我的任何角色?”。你永远不会取消你的指针。然而,输出不是指针值,而是包含指针指向的一系列char对象。即显然cout决定解除引用你的指针,即使你从未明确要求它。这是你应该问的问题:为什么我的指针会被取消引用?

而答案是[const] char *指针在使用<<运算符发送到cout时会受到特殊处理。有专门为此目的而引入的专用重载版本<<。该版本的<<运算符会将char *指针视为指向C字符串的开头。并且该运算符将输出整个C字符串一直到零终止符字符。这正是您实验中发生的情况。

请注意,如果您使用任何其他指针类型(例如int *),您将看不到输出中的指向值(或多个值)。您将看到指针本身的实现相关表示。