我怀疑下面的程序
#include "stdafx.h"
#include "stdio.h"
#include <iostream>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
char *chr = "hello";
cout<<chr; //hello
cout<<endl;
cout<<*chr; //h
cout<<endl;
cout<<*(&chr); //hello
system("pause");
return 0;
}
为什么第二个cout打印h,而第三个打印你好时代表相同的
答案 0 :(得分:5)
要更加明确一点。 chr
是一个指向一大块记忆的指针,其中的字符是&#39; h,&#39;&#39;&#39; l&#39;&#39; l&#39; 39;和&#39; o&#39;存储。在chr
的最后一个字符是终止\0
之后。这需要表明chr
指向的块现在已经结束。
当将chr
传递给cout时,cout将读取(不是通过使用<<
运算符来调用它自己的基础函数)这个块直到终止\0
。将*chr
传递给cout
时,您取消引用指针,只需将chr
指向的第一个字符传递给cout
(&#39; h&#39;)。
*(&chr)
与chr
完全相同,因为地址运算符为您提供了chr
的地址,它是指向字符指针的指针。使用*
取消引用它将为您提供指向内存块的指针,以&#39; h&#39;并且cout
将再次阅读终止\0
。
修改强>
正如birdypme指出的那样,*
运算符(解除引用运算符)与address-of运算符相反。它就像+
和-
。因此这样的事情
cout << *(&(*(&chr))) << endl;
仍然与
相同cout << chr << endl;
如果你愿意,你可以做到无限。
cout << *(&(*(&(*(&(*(&(*(&(*(&(*(&chr))))))))))))) << endl; // I hope i didn't miss a ')'
答案 1 :(得分:0)
因为在第二种情况下,你传递给cout一个char
,chr
指向的那个,即C字符串"hello"
中的第一个。
答案 2 :(得分:0)
在第二个示例中,您解除引用指针。这与使用chr[0]
相同,在这种情况下,它是h
。
在最后一个示例中,您将获取chr
的地址,然后取消引用:
&chr --> char**
*(&chr) --> char*
所以,你又来了char*
答案 3 :(得分:0)
您的陈述
cout<<*chr; is same as cout<<chr[0];
因为指针被取消引用并且只传递chr
如果是cout<<*(&chr);
,如果我将其转换为单词,则会打印出chr
地址处的值。既然chr
是一个指针,你将通过这个语句&chr
得到一个指向指针的指针,你再次取消引用它,它会给你hello
。