[英]pointers *char and &char
我对下面的程序有疑问
#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,而当第三个cout表示相同时
更明确一点。 chr
是指向存储字符“ h”,“ e”,“ l”,“ l”和“ o”的内存块的指针。 在chr
的最后一个字符之后是终止\\0
。 这需要发出信号,指示chr
指向的块现在结束了。
当将chr
传递给cout时,cout会读取(直到使用自身本身不是cout,而是通过使用<<
操作符调用该函数的底层函数)该块,直到终止\\0
为止。 当通过*chr
到cout
取消引用指针,简单地将第一个字符指出通过chr
至cout
(“H”)。
*(&chr)
是同样的事情,只是chr
因为运营商-的ADRESS给你的ADRESS chr
至极是一个指针的指针人物。 然后,使用*
取消引用将为您提供指向以'h'开头的内存块的指针,而cout
将再次读取到终止的\\0
。
编辑
正如birdypme正确指出的, *
运算符(解引用运算符)与address-of运算符相反。 就像+
和-
。 因此,像这样
cout << *(&(*(&chr))) << endl;
仍将与
cout << chr << endl;
如果愿意,您可以做到这一点。
cout << *(&(*(&(*(&(*(&(*(&(*(&(*(&chr))))))))))))) << endl; // I hope i didn't miss a ')'
因为在第二种情况下,要传递到cout的单个char
,所述一个指出由chr
,即第一C形串的"hello"
。
在第二个示例中,您将取消引用指针。 这与使用chr[0]
,在这种情况下为h
。
在上一个示例中,您使用chr
的地址,然后取消引用:
&chr --> char**
*(&chr) --> char*
所以在,您又有了一个char*
您的声明
cout<<*chr; is same as cout<<chr[0];
因为指针已取消引用,并且仅传递chr
指向的第一个chr
如果cout<<*(&chr);
,如果我将其转换为单词,它将打印出现在chr
地址处的值。 现在,由于chr
是一个指针,因此您将通过&chr
语句获得指向指针的指针,并再次取消引用它,这使您hello
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.