Ich habe einige Verwirrung/Probleme mit der Verwendung von Zeigern in C. Ich habe den Beispielcode unten eingefügt, um ihn leicht zu verstehen. Bitte beachten Sie die Unterschiede dieser Codes. Wenn Sie Probleme haben, es zu verstehen, geben Sie bitte ein Feedback.
Gibt es eine andere Möglichkeit, ein Array von Integer-Zeigern zu initialisieren, ohne diese individuelle Zuweisungsmethode zu verwenden?
arr[0]=3;
arr[1]=1;
arr[2]=4;
arr[3]=5;
arr[4]=2;
Wie kann ich die Größe / Anzahl der Zuordnungen im Speicher des Zeigers abrufen, damit ich so etwas verwenden kann? for(int z=0;z<NUM;z++) { Anstatt von for(int z=0;z<5;z++) { statisch?
Jede Antwort wird sehr geschätzt.
Danke im Voraus.
Benutzt du gcc? arr=(int[]){3,1,4,5,2}; Ich denke, es ist kein gültiges C++.
– Jess Gut
16. Mai 2012 um 23:59 Uhr
Ja, ich verwende den gcc-Compiler. Ist es kein gültiges C++? arr=(int[]){3,1,4,5,2};
– schüchtern
17. Mai 2012 um 0:02 Uhr
Ja, sie werden gerufen zusammengesetzte Literale und gcc akzeptiert sie in C++ als Erweiterung (versuchen Sie, mit -pedantic und Sie sollten eine Warnung erhalten).
– Jess Gut
17. Mai 2012 um 0:09 Uhr
Sie haben dort stdlib.h UND iostream. Auch Namensraum UND malloc. Welche Sprache ist das ? C+ ?
– Scharlachroter Amaranth
17. Mai 2012 um 0:11 Uhr
@ScarletAmaranth, ich habe iostream und Namespace entfernt. Es ist C. Danke.
– schüchtern
17. Mai 2012 um 0:16 Uhr
Ernest Friedman Hill
Das malloc Aufrufe in den ersten Beispielen weisen einen Speicherblock zu und weisen diesem Speicher einen Zeiger zu arr. Sobald Sie zuordnen arr Auch hier wird der Zeigerwert überschrieben, und Sie haben den Überblick über den zugewiesenen Speicher verloren – dh Sie haben ihn verloren. Das ist genau dort ein Fehler.
Mit anderen Worten, wenn Sie einen Speicherblock mit using zuweisen malloc()dann können Sie Daten mit Array-Syntax hineinschreiben (zum Beispiel):
Aber Sie können nichts anderes direkt zuweisen arr, oder Sie verlieren den Zeiger auf diesen Speicherblock. Und wenn Sie einen Block mit zuweisen malloc()vergessen Sie nicht, es mit zu löschen free() wenn du es nicht mehr brauchst.
Ein Array ist nicht ein Zeiger auf eine ganze Zahl; es ist ein Array. Es wird gesagt, dass ein Array-Name “in einen Zeiger zerfällt”, wenn Sie ihn als Argument an eine Funktion übergeben, die einen Zeiger als Argument akzeptiert, aber sie sind nicht dasselbe.
Zu Ihrer letzten Frage: Das ist eigentlich der Unterschied zwischen einem Array und einem Pointer-to-Type: Der Compiler kennt die Größe eines Arrays, aber er kennt nicht die Größe eines Blocks, auf den ein beliebiger Pointer-to-Type zeigt. Die Antwort lautet leider nein.
Aber da Sie C++ und nicht C schreiben, sollten Sie sowieso keine Arrays verwenden: verwenden Sie `std::vector’! Sie kennen ihre eigene Länge und sind erweiterbar.
Den Vektor von STL zu verstehen, ist für den Anfänger zu schwierig.
– Stepan Jakowenko
17. Mai 2012 um 0:24 Uhr
@Ernest Friedman-Hill, ich habe nicht verstanden, hat der Code einen Fehler, den ich gepostet habe? Welcher hat den Fehler?
– schüchtern
17. Mai 2012 um 0:41 Uhr
@ user643540 — Ich hoffe, du machst Witze. Es ist einfacher, als von einem Baumstamm zu fallen.
– Ernest Friedman Hill
17. Mai 2012 um 0:59 Uhr
@prime — Die beiden, die enthalten malloc Verwenden Sie es falsch, und als Ergebnis verlieren Sie Speicher, was ein Fehler ist.
– Ernest Friedman Hill
17. Mai 2012 um 1:00 Uhr
@ErnestFriedman-Hill, sagst du mir, ich soll malloc nicht verwenden? Oder wie soll ich malloc verwenden und dann Werte zuweisen?
– schüchtern
17. Mai 2012 um 1:03 Uhr
Stepan Jakowenko
Wenn du sagst: ptr = {1,2,3,4,5}du machst ptr zeigen auf einen Speicher im Datensegment, wo konstantes Array {1,2,3,4,5} befindet sich und somit verlieren Sie Speicher. Wenn Sie Ihren Speicher gleich nach der Zuweisung initialisieren möchten, schreiben Sie: ptr[0]=1; ptr[1]=2; usw. Wenn Sie Daten kopieren möchten, verwenden Sie memcpy.
Ich möchte den Wert nicht individuell zuweisen, wie ich dort sagte.
– schüchtern
17. Mai 2012 um 0:04 Uhr
Wie möchten Sie den zugewiesenen Speicher füllen? Vielleicht möchten Sie nur Daten aus Ihrem konstanten Array lesen? Dann sagen Sie einfach: ptr = {1,2,3,4,5} ohne alloc() oder new[]. Aber Sie hätten keine Chance, dieses Array zu ändern.
– Stepan Jakowenko
17. Mai 2012 um 0:18 Uhr
Ihre Antwort ist etwas verwirrend. Was ist ptr hier Array oder Zeiger? Können Sie bitte den vollständigen C-Code mit ptr posten?
– schüchtern
17. Mai 2012 um 0:20 Uhr
Zeiger und Array sind in C gleich. Wenn Sie möchten, können Sie mich per Skype kontaktieren (stiv.yakovenko). Ich werde versuchen, es anhand eines Diagramms in mspaint zu erklären.
– Stepan Jakowenko
17. Mai 2012 um 0:22 Uhr
@stiv Es tut mir leid, Ihnen zu widersprechen, aber Arrays und Zeiger sind zwei sehr unterschiedliche Dinge in C. Versuchen Sie einfach Folgendes, wenn Sie mir nicht glauben: int a[3]; printf("sizeof(a) = %d\n", (int)sizeof(a)); printf("sizeof(a + 0) = %d\n", (int)sizeof(a + 0)); Der Erste printf() druckt 12, die zweite 8. Warum? Weil in a + 0 der Array-Bezeichner zerfiel in einen Zeiger, und das ist etwas ganz anderes als ein Array.
– Cmaster – Wiedereinsetzung von Monica
6. Januar 2014 um 13:03 Uhr
Die kommaseparierte Werteliste ist ein Konstrukt zum Initialisieren von Arrays. Es ist nicht zum Initialisieren von Zeigern auf Arrays geeignet. Deshalb brauchst du das (int[]) – Es weist gcc an, ein unbenanntes Array von Ganzzahlen zu erstellen, das mit den bereitgestellten Werten initialisiert wird.
gcc verhindert, dass Sie die Informationen verlieren arr ist ein Array, es sei denn, Sie möchten es wirklich. Deshalb braucht man eine Besetzung. Es ist besser, dass Sie erklären arr als Array, nicht als Zeiger. Sie können es immer noch an die Funktionen übergeben, die einen Zeiger akzeptieren. Dennoch würde gcc Sie mit malloc nicht zulassen, dass Sie Speicher verlieren:
error: incompatible types when assigning to type ‘int[5]’ from type ‘void *’
Wenn Sie eine Variable wollen, die entweder ein Array oder ein Zeiger auf zugewiesenen Speicher sein kann, erstellen Sie dafür eine andere Variable. Besser noch, erstellen Sie eine Funktion, die einen Zeiger akzeptiert und entweder ein Array oder einen Zeiger übergibt.
14325800cookie-checkArray von Integer-Zeigern in C initialisierenyes
Benutzt du gcc?
arr=(int[]){3,1,4,5,2};
Ich denke, es ist kein gültiges C++.– Jess Gut
16. Mai 2012 um 23:59 Uhr
Ja, ich verwende den gcc-Compiler. Ist es kein gültiges C++?
arr=(int[]){3,1,4,5,2};
– schüchtern
17. Mai 2012 um 0:02 Uhr
Ja, sie werden gerufen zusammengesetzte Literale und gcc akzeptiert sie in C++ als Erweiterung (versuchen Sie, mit
-pedantic
und Sie sollten eine Warnung erhalten).– Jess Gut
17. Mai 2012 um 0:09 Uhr
Sie haben dort stdlib.h UND iostream. Auch Namensraum UND malloc. Welche Sprache ist das ? C+ ?
– Scharlachroter Amaranth
17. Mai 2012 um 0:11 Uhr
@ScarletAmaranth, ich habe iostream und Namespace entfernt. Es ist C. Danke.
– schüchtern
17. Mai 2012 um 0:16 Uhr