【问题标题】:Pointer output issue in C++C ++中的指针输出问题
【发布时间】:2019-03-15 09:43:47
【问题描述】:

我正在尝试在 TurboC++ 中执行这个 C++ 程序代码

    #include<iostream.h>
    #include<stdio.h>
    #include<conio.h>
    void main()
    {clrscr();
     int i;
     long int a=10,*p;
     p=&a;
     for(i=0;i<10;i++)
     {printf("\n{Via printf}\t&a=%p,p=%p",&a,p);
      cout<<"\n{Via cout}\t&a="<<&a<<",p="<<p;
      p=p+1;
     }
     getch();
    }

现在,这个程序的输出如下:

    {Via printf}    &a=FFF2,p=FFF2                                                  
    {Via cout}      &a=0x8f87fff2,p=0x8f87fff2                                      
    {Via printf}    &a=FFF2,p=FFF6                                                  
    {Via cout}      &a=0x8f87fff2,p=0x8f87fff6                                      
    {Via printf}    &a=FFF2,p=FFFA                                                  
    {Via cout}      &a=0x8f87fff2,p=0x8f87fffa                                      
    {Via printf}    &a=FFF2,p=FFFE                                                  
    {Via cout}      &a=0x8f87fff2,p=0x8f87fffe                                      
    {Via printf}    &a=FFF2,p=0002                                                  
    {Via cout}      &a=0x8f87fff2,p=0x8f870002                                      
    {Via printf}    &a=FFF2,p=0006                                                  
    {Via cout}      &a=0x8f87fff2,p=0x8f870006                                      
    {Via printf}    &a=FFF2,p=000A                                                  
    {Via cout}      &a=0x8f87fff2,p=0x8f87000a                                      
    {Via printf}    &a=FFF2,p=000E                                                  
    {Via cout}      &a=0x8f87fff2,p=0x8f87000e                                      
    {Via printf}    &a=FFF2,p=0012                                                  
    {Via cout}      &a=0x8f87fff2,p=0x8f870012                                      
    {Via printf}    &a=FFF2,p=0016                                                  
    {Via cout}      &a=0x8f87fff2,p=0x8f870016

我知道 0x(即通过 cout 输出的 p)表示十六进制编号。 ,
它的最后四位数字也表示它的存储值,
但是 8f87(它的第三、第四、第五和第六位数字)是什么意思?

【问题讨论】:

  • 数字是所有的数字。 BTW p=p+1; 增加指针,而不是它指向的内容。
  • 可能是地址的段部分?
  • 强制提醒 Turbo C++ 已经过时了。如果可以的话,从本世纪获得一个编译器。
  • 建议:不要使用 TurboC(它比你还老)。我们处于 21 世纪,还有更好的选择。
  • ... 而 TurboC 使用了几十年来没有人使用过的分段内存模型。相信我,你不想知道细节。

标签: c++ pointers output


【解决方案1】:

printfcout 都打印指针的值。

printf 只打印偏移部分,而cout 打印指针的段和偏移部分(即使段是无意义的,如在某些内存模型中,段不存储在指针中。在这种情况下,打印段寄存器的值,可能是DS)。

0x8f87fff2可以拆分为segment:offset表示法:8f87:fff2,其中8f87是segment,fff2是offset。

【讨论】:

    【解决方案2】:

    整个指针地址以十六进制输出,为什么printfcout输出不同的值是一个实现问题。

    这是存储您的数据的位置,它与该数据的无关:

    long int a=10,*p;
    p=&a;
    &a; // where that data is stored
    p; // where that data is stored
    a; // value of that data
    *p; // value of that data
    

    【讨论】:

      【解决方案3】:

      但是 8f87(它的第三、第四、第五和第六位数字)是什么意思?

      该标准在其对compound types 的讨论中声明:

      指针类型的值表示是实现定义的。

      所以我们不能确定这些数字代表什么。

      正如其他人在 cmets 中指出的那样,Turbo C++ 非常古老,最好使用免费的编译器,如 GCC 或 Clang。

      在 GCC 中,cout 和 printf 打印完全相同。见Demo

      【讨论】:

        【解决方案4】:

        不要试图解释指针值,除非你正在编写硬件驱动程序。

        一般来说,指针只是 32 或 64 位数字,表示内存中的某个字节。 根据您运行的系统,您将获得不同的值。你不应该关心指针的实际值是什么。您应该注意它指向的地址是否有效(不为空,并且那里的数据没有被删除)。

        无论内存是如何分配的,好的程序都可以运行。

        printf 和 cout 之间的区别可能是由于它们的实现方式。 TurboC++ 无论如何都是古老的,所以我不能给你一个完整的答案,说明你为什么会看到差异。

        一个值得注意的例外是与内存映射的驱动程序进行低级交互。这通常通过将特定范围的地址映射到特定硬件设备并修改这些范围内的数据来指示硬件采取某些操作来实现。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-06-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多