2016-11-14 5 views
-3

Ich möchte das Äquivalent von% p-Tag in printf erstellen und den hexadezimalen Wert eines Zeigers schreiben. Aber ich wollte wissen, was die 0x und die 4 ersten Zeichen bedeuten? Weil, wenn ich es von dezimal zu hexadezimal übersetze, ich nur die letzten 8 Zeichen habe. Also, was sind die drei Teile, die einen Zeiger bilden?Wie ist ein Zeiger in C zusammengesetzt?

Ich meine: Wenn ich versuche, einen Zeiger in Hexadezimal (mit meiner eigenen Funktion) zu konvertieren, bekomme ich 8 Zeichen.

Wenn ich das% p-Flag des printf verwenden, erhalte ich eine Rückkehr, die wie folgt aussieht: [0x] [7FFD] [die letzten 8 Zeichen ich] (ohne die [])

Hier mein Conversion-Code (Es wird nur für hexa, Binär- und oktal arbeiten):

char *convert_to_base(int nb, char *base_str) 
{ 
    char *result; 
    int i; 
    int has_begin; 
    int base; 
    int diviser; 

    base = my_strlen(base_str); 
    result = malloc(sizeof(char) * 12); 
    diviser = (base >= 10) ? my_power_rec(base, 7) : my_power_rec(base, 10); 
    has_begin = 0; 
    i = 0; 
    while (diviser != 0) 
    { 
     if (!has_begin) 
     has_begin = (base_str[nb/diviser] != '0') ? 1 : 0; 
     if (has_begin) 
     { 
      result[i] = base_str[nb/diviser]; 
      nb = nb % diviser; 
      i += 1; 
     } 
     diviser /= base; 
    } 
    result[i] = '\0'; 
    return (result); 
} 

verwende ich openSUSE

+0

verwenden Ich bin nicht sehr klar..können Sie umschreiben? –

+1

'0x' ist ein Präfix .. aber die ersten 4 Zeichen? Sie sind tatsächlich Ziffern ... –

+0

Ja, aber Ziffern in Hexadezimal, die Zeichen verwendet – Orionss

Antwort

2

nach der Spezifikation des Standard des p Spezifizierer,

Das Argument soll ein Zeiger auf void sein. Der Wert des Zeigers ist umgewandelt in eine Folge von Druckzeichen, in einer Implementierung definierten Art und Weise.

Das heißt, in einigen Plattformen (zum Beispiel Linux) Zeiger können als unsigned long s für die Zwecke der printf behandelt werden. Daher sehen Sie den Wert des Zeigers als Ganzzahl, konvertiert in Basis 16.

Ohne Ihre Plattform zu kennen, ist das so viel, wie man darüber sagen kann.

+0

10 Ok, ich denke, mein Problem kommt, weil ich unsigned int anstelle von lang benutze, danke.Und ich benutze Linux openSUSE – Orionss

0

Die 0x ist nur ein Präfix, das angibt, dass es sich um eine Hexadezimalzahl handelt. Die Zahlen sind nur der Wert (alle von ihnen), die Anzahl der Zahlen ist wegen der Größe der Adresse, und das hängt von der OS-Architektur ab.

0

Wenn Sie das Format des Zeigers steuern möchten, verwenden Sie die Informationen aus <inttypes.h> - definiert durch C99 und C11:

uintptr_t ptrval = (uintptr_t)void_pointer; // Or any other object pointer 

printf("0x%.8" PRIXPTR "\n", ptrval); 

Diese produzieren könnten:

0x7FFF8192AFE0 

zum Beispiel. Es ist eine Notation, die ich häufig verwende. Klar, können Sie snprintf() anstelle von printf(), etc.