Ошибка вывода указателя в C ++ - PullRequest
2 голосов
/ 15 марта 2019

Я пытаюсь выполнить этот программный код C ++ в TurboC ++

    #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 (т. Е. Вывод p через cout) означает шестнадцатеричное нет.
также его последние четыре цифры обозначают его сохраненное значение,
но что обозначает 8f87 (его третья, четвертая, пятая и шестая цифры)?

Ответы [ 4 ]

2 голосов
/ 15 марта 2019

Оба printf и cout выводят значение указателя.

printf просто печатает смещенную часть, а cout печатает как сегмент, так и смещенную часть указателя (даже если сегмент не имеет смысла, как в некоторых моделях памяти, сегмент не сохраняется в указателе.В этом случае печатается значение регистра сегмента, возможно DS).

0x8f87fff2 можно разбить на сегмент: нотация смещения: 8f87: fff2, где 8f87 - это сегмент, а fff2 - это смещение.

2 голосов
/ 15 марта 2019

Весь адрес указателя выводится в шестнадцатеричном формате, поэтому printf и cout выводят разные значения - это проблема реализации.

Это , где ваши данные хранятся, он не имеет ничего общего с значением этих данных:

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
0 голосов
/ 15 марта 2019

Не пытайтесь интерпретировать значения указателя, если вы не пишете аппаратные драйверы.

Обычно указатели - это просто 32- или 64-разрядные числа, которые обозначают некоторый байт в памяти.В зависимости от системы, на которой вы работаете, вы получите разные значения.Вам никогда не нужно заботиться о значении указателя.Вы должны позаботиться о том, чтобы адрес, на который он указывает, был действительным (не нулевым, и данные там не были удалены).

Хорошие программы будут работать независимо от того, как распределена память.

Разницамежду printf и cout, скорее всего, связано с тем, как они реализованы.TurboC ++ является древним во всех отношениях, поэтому я не могу дать вам полный ответ о том, почему вы видите разницу.

Одним заметным исключением является низкоуровневое взаимодействие с драйверами, отображаемыми в память.Обычно это работает путем сопоставления определенного диапазона адресов определенному аппаратному устройству, а изменение данных в этих диапазонах заставит аппаратное обеспечение предпринимать определенные действия.

0 голосов
/ 15 марта 2019

но что обозначает 8f87 (его третья, четвертая, пятая и шестая цифры)?

Стандарт гласит, что при обсуждении составных типов :

Представление значений типов указателей определяется реализацией.

Так что мы не можем точно сказать, что обозначают эти цифры.

Как отмечали другие в комментариях, Turbo C ++ очень стар, и вам лучше использовать бесплатные компиляторы, такие как GCC или Clang.

В GCC и cout, и printf печатают одинаково. См Демо .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...