繁体   English   中英

指针* char和&char

[英]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为止。 当通过*chrcout取消引用指针,简单地将第一个字符指出通过chrcout (“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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM