Größe des Arrays von Zeigern
ich habe eine Frage bezüglich sizeof-operator
Code 1:
int main()
{
int p[10];
printf("%d",sizeof(p)); //output -- 40
return 0;
}
Code 2:
int main()
{
int *p[10];
printf("%d",sizeof(*p)); //output -- 4
return 0;
}
in der ersten code-p Punkte in ein array von ints.
in der zweiten code-p Punkte in ein array von Zeigern.
ich bin nicht in der Lage zu verstehen, warum der erste code o/p ist 40 aber der 2. code o/p 4 dachte, die beiden Punkte zu einem array der gleichen Größe ?
In deinem 2. Beispiel (und in der Regel für arrays), die
*p
ist das gleiche wie p[0]
. So sizeof(*p)
ist das gleiche wie sizeof(p[0])
ist die Größe eines Zeigers.
InformationsquelleAutor Amol Sharma | 2011-12-20
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die Ausgabe des folgenden Programms wird Ihnen einige Hinweise und Verständnis über die Größe von einen Typ und einen Zeiger auf einen Typ.
Nun zu deiner Frage:
Sind Sie richtig. In den code:2, um die Größe des Arrays, wo die p Punkte zu bekommen, muss man die base Adresse
und nicht die folgenden
Den folgenden gleichwertig sind:
Folgende ist die Antwort auf Ihre andere Frage:
Ich habe aktualisiert mein Vorherige Antwort auf Ihren oben genannten Frage. Hoffe, das hilft.
danke....ich habe der Unterschied....Sie können nicht ändern, p (im Falle p[10]), aber ändern kann(im Falle von (*p)[10])...zB.Inkrement..
Ich bin froh, dass. OTOH, könntest du bitte markieren Sie die richtige post als eine Antwort auf Ihre Frage, nachdem Sie fertig sind mit dem Training/lernen?
InformationsquelleAutor Sangeeth Saravanaraj
Grundsätzlich, Sie haben ein array von Zeigern. Wenn du das getan hast
*p
Sie dereferenziert den Zeiger auf das erste element des Arrays. Also, der Typ wäre int.sizeof(int*)
passiert einfach 4 auf Ihrem Rechner.Bearbeiten (Klärung):
Code-snippet 1, du bist grabbing die Größe des Arrays.
Code-snippet 2, Sie greifen die Größe des Typs gezeigt, durch das erste element des array von Zeigern.
sizeof
nicht dereferenzieren nichts.Die OP dereferenziert den Zeiger. sizeof(*p) bedeutet "groß, was wird gezeigt, durch p"
Die Sache ist die
sizeof
Betreiber ist das Besondere und nicht dereferenzieren seine Argumente 🙂Wäre das nicht *p das Objekt dereferenziert und sizeof unter der Größe? Ich glaube nicht, dass ich je gehört habe sizeof nicht, ein dereferenzierter parameter
Das ist richtig, auf meinem Rechner (64-bit) sizeof(*p) == 4 und sizeof(int) == 4, aber sizeof(int*) == 8, so ergibt sizeof int nicht int-Zeiger
InformationsquelleAutor tangrs
überprüfen Sie diesen code:
in diesem code p Punkte, um ein array von Zeigern daher die o/p ist 40
In Ihrem Fall ist es ein array von Zeigern, so dass das o/p 4
InformationsquelleAutor Anil Kumar Arya
In der ersten-code:
p
nicht auf ein array von int-Werten; p ist ein array von ints. In der Anweisungwerden sollte
den Ausdruck
p
bezieht sich noch auf das array-Objekt, sosizeof(p)
ergibt sich die Größe des array-Objekts,, die passiert werden 40 bytes auf deinem system (10 * sizeof (int)
).In der zweiten:
wieder
p
ist ein array von Zeigern. Aber in der folgenden Anweisung:den Ausdruck
p
umgewandelt in einen Zeiger auf das erste element des Arrays (nicht auf das gesamte array). Die Dereferenzierung, die Zeiger (mit der unäre*
operator) gibt Ihnen eineint*
Objekt, nämlich das erste element des Arrays. Die Größe einesint*
Zeiger, die auf Ihrem system passiert zu sein, 4. (sizeof (int)
undsizeof (int*)
sind nicht unbedingt die gleichen; es passiert, dass Sie auf Ihrem system.)In C gilt die Regel, dass jeder Ausdruck der array-Typ (wie der name einer array-variable) wird automatisch in einen Zeiger auf das array das erste element -- die meiste Zeit. Es gibt drei Ausnahmen:
sizeof
(sizeof arr
ergibt sich die Größe des array-Objekts, nicht die Größe eines Zeigers)&
(&arr
Erträge die Adresse, die das gesamte array-Objekt, nicht die Adresse des ersten Elements; gleiche Speicher, verschiedene Typen)int arr[6] = "hello";
konvertieren nicht"hello"
auf einen Zeiger, es kopiert das array).Dringend empfohlen, zu Lesen: Abschnitt 6 von der comp.lang.c FAQ.
InformationsquelleAutor Keith Thompson
Schau mal in deinem ersten code-snippet p ist array, dessen Größe ist 40 bytes.Nun, wie kommt es heraus zu 40 byte ist einfach, Arrays p enthält 10 Mitglieder und jedes Mitglied mit der Größe 4 bytes
Im zweiten code-snippet p ist nichts als array von Zeiger bedeutet, dass jedes Element dieses Arrays ist ein Zeiger auf einen int-Wert.Nun *p kennzeichnet den Wert, auf den ersten index des Arrays, und dieser Wert ist nichts, aber eine Adresse ist 4 bytes.
Hofft, die Dinge werden klar für Sie jetzt.
InformationsquelleAutor Amit Singh Tomar