Pointer auf Char
-
C-Strings sind keine Elemente der Sprache C sondern nur eine Vereinbarung.
Es sind nullterminierte char-Arrays. D.h das Zeichen '\0' (mit dem Wert 0) zeigt das Ende der Zeichenkette an.Der Arrayname steht für die Adresse vom ersten Element.
Ein Stringliteral (Text zwischen " ") wird automatisch terminiert und ist die Adresse auf das erste Zeichen.
char array[4] = {'A', 'B', 'C', '\0'}; char array[] = "ABC";
ergibt das Selbe. Da ist kein Unterschied.
Die Zuweisung von Inhalten an Arrays mit dem = funktioniert aber nur bei der Definition. Sonst nicht.Auch ist
pointer1 = &array[0]; pointer1 = array;
identisch.
Bei
pointer2 = "neu";
weist du pointer2 die Adresse von dem Stringliteral zu. Das steht irgendwo im Speicher. Darum hast du bei %p auch andere Adressen.Bei
*pointer1 = 'H';
schreibst du ein 'H' an die Stelle, auf die pointer1 zeigt. Sonst änderst du nichts. Da wird dann auch keine '\0' geschrieben, die das Ende kennzeichnet.%s bei printf erwartet die Adresse von einem C-String und gibt diesen aus.
Arrays werden in C anders behandelt als die integralen Typen.
Der Name zerfällt in die Adresse vom ersten Element.
Es ist kein Zeiger, da du diese Adresse nicht ändern kannst.C macht auch keinen Unterschied bei den Arrays. Der Compiler hilft durch die automatische Terminierung von Stringliteralen.
Der Rest ist eine Vereinbarung. Allerdings baut die C-Standard-Library darauf auf.
-
Norben schrieb:
meines erachtens gebe ich mit printf("%d", *pointer) den wert des pointers auf den er zeigt aus. wenn ich nur printf("%d", pointer) als beispiel schreibe, kommt ja blödsinn raus. er würde quasi den inhalt auf den er zeigt als dezimalzahl darstellen wollen.
Den Inhalt würde er nur anzeigen, wenn du den Zeiger auch dereferenzierst, sonst gibt er den nach int konvertierten Wert der Zeigervariable aus.
Handwerker2013 schrieb:
char *pointer = &array; // so nicht, das wäre die adresse der ersten adresse des ersten chars also ein char **pointer(glaube ich)
&array bedeutet (sinnigerweise) Adresse von array mit dem Typ Zeiger auf array und nicht Zeiger auf char.
-
Ist array(arr[]) und Zeiger auf Zeiger(**arr) nicht dasselbe?
-
Bitte nochmal verständlich.
Falls du nur die Bezeichner in den Klammern meinst: Nein, das ist nicht dasselbe.
-
Was ist der Unterschied zwischen **char arr; und char arr[]; ?
-
Das eine ist ein Zeiger, also eine Adresse von was, und das andere ist ein Array, also eine Aufreihung gleichartiger Objekte. Völlig verschiedene Sachen.
-
Ja, stimmt, Zeiger und Arrays sind wirklich ziemlich unterschiedlich. Hier ist eine gut verständliche Seite mit Fragen und Antworten zu dem Thema. Das ist auch für Nichtakademiker leichte Kost.
-
http://cdecl.org/ schrieb:
char arr[]; declare arr as array of char
char **arr; declare arr as pointer to pointer to chararr[] als Variablendefinition:
Bei arr[] reicht einmal dereferenziern aus, um auf ein char zu kommen.
Es ist ein 1D-Array
Das kann mit Arrayzugriff oder mit dem * sein. (arr[0] oder *arr)
Du kannst arr nicht verändern (arr++ geht nicht). Es ist kein Pointer.
sizeof() liefer die Größe des Arrays in Byte.arr[] in der Parameterliste einer Funktion:
Es wird zu *arr. Also einem Pointer
Einmal dereferenzieren.Bei arr musst du zweimal dereferenziern aus, um auf ein char zu kommen.
Es ist ein Pointer.
Du kannst das char als Zeiger auf char[] benutzen.
Es ist kein Zeiger auf ein echtes 2D-ArrayFür Pointer gilt:
Du kannst arr verändern (z.B. arr++ )
Derefernzieren kann mit Arrayzugriff [] oder mit dem Operator * sein.
sizeof() liefert die Größe des Zeigers in Byte
Du kannst (mit arr) keine Ausssage über die Größe des Blocks treffen auf den arr zeigt.
-
is schon nich wirklich einfach
eine einfache hoffentlich letzte frage noch.
ein array mit z.b. "ABC" würde ja bedeuten, dass
buchstabe A im array[0]
buchstabe B im array[1]
und buchstabe C im array[2] steht.wenn ich einen pointer erstelle, wie im folgenden beispiel:
char array[] = "ABC"; char *pointer; pointer = array; //oder: pointer = &array[0]; pointer = "neu";
dann will ich aber mein array[1] wo "B" drin steht, auf z.b. "neu" ändern (können).
DirkB schrieb:
Bei
pointer = "neu";
weist du pointer die Adresse von dem Stringliteral zu. Das steht irgendwo im Speicher. Darum hast du bei %p auch andere Adressendirkb meinte ja das dann im pointer irgendeine speicheradresse steht, wo wiederum "neu" drin steht. ich will aber das "neu" im array[1] steht und nicht irgendwo. geht das dann nicht irgendwie mit hilfe eines pointers?
-
ok das war fail. ich sollte doch öfters eine pause machen
ist natürlich klar, dass ich kein string in einzelnes char array speichern kann.ich kann natürlich mit dem dereferenzierungsoperator einen buchstaben ins array speichern/überschreiben. aber strings gehen ja schlecht in ein einzelnes array
sry!
-
"neu" besteht aus 4 Zeichen (3 Buchstaben + '\0')
array[1] ist ein char und bietet Platz für ein Zeichen.Wie soll da das Ergebnis aussehen?
-
Dein Antwort habe ich gerade beim schreiben nicht mehr gesehen.
-
kein problem! wie gesagt: muss mal frische luft schnappen gehen
danke aber vielmals für die antworten