Was ist der Unterschied zwischen float-Zeiger und int-Zeiger-Adresse?

Habe ich versucht, diesen code auszuführen,

int *p;
float q;
q = 6.6;
p = &q;

Obwohl es eine Warnung sein, aber ich denke &q und p sind von der gleichen Größe, so p können eine Adresse q. Aber wenn ich drucken &q und p ich bin immer anders ausgegeben.
Das ist meine Ausgabe

*p =  6.600000 
 q = 0.000000, p = 0x40d33333, &q = 0x7fffe2fa3c8c 

Was ist, dass ich bin fehlt?
Und p und &q ist die gleiche, wenn beide Zeiger und Variablen-Typ ist der gleiche.

Meine komplette code ist

#include<stdio.h>
void main()
{   
    int *p;
    float q;
    q = 6.6;
    p = &q;
    printf("*p =  %f \n q = %f, p = %p, &q = %p \n",*p,q,p,&q);
}
  • Zeig bitte den code, die Sie verwenden, um das zu bekommen Ausgabe.
  • Wenn ich Sie Recht haben, möchten Sie möglicherweise verwenden Sie eine union...
  • Es ist int main(void), nicht void main(). void main() ist meist nützlich für die Erkennung von Büchern von Autoren, die nicht wissen, C sehr gut.
  • Sie sind runing auf x86_64? Was dann geschieht wahrscheinlich in printf("*p = %f \n q = %f, p = %p, &q = %p \n",*p,q,p,&q); ist, dass der vermeintliche int *p übergeben wird, in einem general purpose register, die double (der beworbene Wert von q) übergeben wird, eine floating-point-register, die zwei Zeiger wieder in Allzweck-Registern.
  • Dann printf liest die ersten floating-point-register für die ersten %f Umwandlung, die zweite floating-point-register für die zweite %f [zufällig enthält 0], das erste, general purpose - register enthält die bits der float 6.6 - drucken p, und der zweite general purpose register (mit dem Wert von p) zu drucken &q. Das register enthält die Adresse des q bleibt ungelesen.
  • Ich weiß int main(void) sollte verwendet werden, immer. Aber in diesem Programm ist es eigentlich egal. Meine wichtigste Frage ist Zeiger beliebigen Typs sein können, aber es wird halten Sie die-Adresse. Dann vergessen Sie die Größe der Datentyp, warum ist die Adresse anders? Und ich weiß auch ich versuche, int* mit Schwimmer, aber ich bin einfach zu Experimentieren mit Zeigern.
  • ja, du hast Recht. Ich teilte die printf im ersten Teile eine für values und das zweite für addresses. Und das problem war mit %f, was ich dachte, war, wenn p enthält Adresse von float es wird immer noch funktionieren wenn ich %f im printf - Anweisung. Aber es lädt die Daten in das Mehrzweckregister dieses problem passiert ist. Nachdem ich split, bekam ich richtigen Adressen, aber die Werte sind doch anders. Danke für die Antwort. 🙂
  • Wenn Sie wissen int main(void) sollte immer verwendet werden, dann schlage ich vor, Sie immer zu benutzen; zumindest wird es vermeiden, die Beschwerden von Menschen wie mir. Wie, warum int* und float* gibt verschiedene Formen, ich habe soeben ein paar Absätzen auf meine Antwort.

InformationsquelleAutor Rohit O | 2013-04-03
Schreibe einen Kommentar