keine variable, kein pointer- was dann?

#1757576
Lesenswert?

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.
#1757591
Lesenswert?

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**
#1757606
Lesenswert?

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.
Gast #1757616
Lesenswert?

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.
#1757625
Lesenswert?

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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren