指针* char和& char

时间:2015-07-23 07:26:30

标签: c++ pointers

我怀疑下面的程序

#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,而第三个打印你好时代表相同的

4 个答案:

答案 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一个charchr指向的那个,即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