moin! ich bin auf das konstrukt char **a gestoßen. ist es eine art pointer?! hilfe!
Der kleine Ma_X möchte bitte aus dem Kinderparadies abgeh... ähm, möchte bitte ein C-Buch lesen!
Ma_X schrieb: > moin! > ich bin auf das konstrukt > > char **a > > gestoßen. ist es eine art pointer?! hilfe! Jeder Stern in einer Deklaration stellt einen Pointer dar. Daher ist das ein Pointer auf einen Pointer der auf char zeigt. Damit kann man so etwas aufbauen a +--------+ | o---------------------+ +--------+ | (char**) | v +---------+ | o--------------+ +---------+ | (char*) | v "Hallo World" in a steht also die Adresse des Pointers drinnen, der auf den String "Hallo World" zeigt.
Karl heinz Buchegger schrieb: > ... > in a steht also die Adresse des Pointers drinnen, der auf den String > "Hallo World" zeigt. Nur zur Sicherheit: in a KANN die Adresse... So wie es im Originalpost steht, tut es das natürlich noch nicht.
Ma_X schrieb: > mir fällt kein fall ein, in dem das sinn macht :( Macht nix, dann brauchst du es auch noch nicht.
Ma_X schrieb: > mir fällt kein fall ein, in dem das sinn macht :( zb: Parameter passing in Funktionen, bei denen die Funktion das übergebene Argument verändern können muss Am Beispiel eines int
1 | void foo( int * i ) |
2 | {
|
3 | *i = 5; |
4 | }
|
5 | |
6 | int main() |
7 | {
|
8 | int j; |
9 | foo( &j ); |
10 | }
|
Jetzt sei i kein int, sondern es gehe um Strings. Ersetzt int von oben durch char* (und natürlich anpassen auf Verwendung von char* anstelle von int)
1 | char Text1[] = "Hallo World"; |
2 | |
3 | void foo( char* * i ) |
4 | {
|
5 | *i = Text1; |
6 | }
|
7 | |
8 | int main() |
9 | {
|
10 | char * text; |
11 | |
12 | foo( &text ); |
13 | |
14 | printf( text ); |
15 | }
|
Allgemeiner: Sei T irgendein Datentyp, und du willst eine Funktion schreiben, die eine Variable vom Typ T beim Aufrufer verändern kann, dann lautet das allgemeine Rezept:
1 | void foo( T * argument ) |
2 | {
|
3 | *argument = .... |
4 | }
|
5 | |
6 | void Aufrufer() |
7 | {
|
8 | T variable; |
9 | |
10 | foo( &variable ); |
11 | }
|
wenn jetzt T zufällig selber wieder ein char* ist, dann ensteht für
1 | void foo( T * argument ) |
eben
1 | void foo( char* * argument ) |
und da an dieser Stelle Leerzeichen keine Rolle spielen, ist das Äquivalent zu einem char**
Hallo Ma_X! Jetzt halte Dich mal fest.. das kann man beliebig weitertreiben! Es gibt Szenarien, wo ein char ***a sinnvoll und nützlich ist :) Gruss Thomas
ja klar, aber wie das so ist, wenn etwas zu toll ist, ist es bestimmt verboten. ich will nicht mit dem gesetz in konflikt geraten!
Im Prinzip ist "char **" die Analogie zu einem String-Array in anderen Sprachen wie z.B. JAVA.
Shuzz schrieb: > Im Prinzip ist "char **" die Analogie zu einem String-Array in anderen > Sprachen wie z.B. JAVA. Vorsicht mit solchen Aussagen. Insbesondere wenn die beiden Begriffe "Pointer" und "Array" in einem Satz vorkommen, ist sehr oft etwas faul im Staate Dänemark. Man kann einen char** dazu benutzen um sich dynamisch ein String-Array zu erzeugen. Aber hier von Analogie zu sprechen, ist schon sehr weit hergeholt.
Ma_X schrieb: > mir fällt kein fall ein, in dem das sinn macht :( Dann hast du noch nie ein C Programm auf normalen Rechnern geschrieben. Denn die fangen effektiv so an: int main (int argc, char **argv) ... wobei man zwar den argv auch anders schreiben kann, aber das ist effektiv das Gleiche wie dies.
ok ok, ich gebe zu es kann verwirrend sein. Nur damit ich's auch richtig verstehe... ;) "char **" bedeutet doch nix Anderes als "Ich bin ein Pointer auf einen Speicherbereich in dem weitere Pointer auf Speicherbereiche liegen die chars enthalten". Und wenn nun ein "char *" auf Strings zeigt (wobei ich in diesem Fall einen einzelnen char als Sonderfall eines Strings sehe), dann zeigt ein "char **" auf eine Ansammlung von Strings.
Shuzz schrieb: > ok ok, ich gebe zu es kann verwirrend sein. > > Nur damit ich's auch richtig verstehe... ;) > "char **" bedeutet doch nix Anderes als "Ich bin ein Pointer auf einen > Speicherbereich in dem weitere Pointer auf Speicherbereiche liegen die > chars enthalten". Genau genommen: nur einer. Aber es können auch mehrere hintereinander sein. Am Pointer kann man das nicht ablesen. Aber im Prinzip stimme ich deiner Aussage zu. > Und wenn nun ein "char *" auf Strings zeigt (wobei ich in diesem Fall > einen einzelnen char als Sonderfall eines Strings sehe), dann zeigt ein > "char **" auf eine Ansammlung von Strings. Er kann! Er muss aber nicht. Das ist der erste Punkt. Der zweite Punkt besteht darin, dass man gerne die Aussage hört "Ein Pointer ist sowas wie ein dynamisches Array" oder Variationen dieser Aussage. Wichtig in diesem Zusammenhang ist die Phrase "ist ein" (oder etwas gleichwertiges) Newbies verbinden gerne damit die Vorstellung, dass sie nur einen Pointer benötigen und sie hätten damit dann auch gleich den Speicher zur Verfügung, in dem die eigentlichen Daten abgelegt werden können. Daher ist bei Aussagen die auf "Pointer ... ist ein ...... irgendwas Array" hinauslaufen, praktisch immer Feuer am Dach. Denn ein Pointer ist kein Array und ein Array ist kein Pointer. Und genau in diesem Sinne habe ich dann auch ein wenig Bauchweh mit der Fomulierung "Im Prinzip ist "char **" die Analogie zu einem String-Array" Ein String-Array wie in Java ist ein eigenständiges Objekt, das auf sich selbst aufpasst und größer wird wenn notwendig. Ein char** tut das aber nicht. Da wird nichts vergrößert oder Speicher allokiert. Ein char** ist ein nützlicher Datentyp, wenn man mit einem Stringarray arbeiten will, aber der Vergleich das er ein String-Array 'sei', hinkt dann doch schon sehr.
> ... "char **" auf eine Ansammlung von Strings.
kann sein; es muß aber keine Ansammlung sein - einer würde auch reichen.
Das muß das/der Programm(ierer) irgendwie am Zusammenhang erkennen.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.