Forum: Mikrocontroller und Digitale Elektronik keine variable, kein pointer- was dann?


von Ma_X (Gast)


Lesenswert?

moin!
ich bin auf das konstrukt

char **a

gestoßen. ist es eine art pointer?! hilfe!

von Daniel (Gast)


Lesenswert?

pointer auf pointer ;-)

von Ma_X (Gast)


Lesenswert?

ernsthaft?

von Klaus (Gast)


Lesenswert?

Der kleine Ma_X  möchte bitte aus dem Kinderparadies abgeh... ähm, 
möchte bitte ein C-Buch lesen!

von Karl H. (kbuchegg)


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.

von Ma_X (Gast)


Lesenswert?

mir fällt kein fall ein, in dem das sinn macht :(

von Klaus W. (mfgkw)


Lesenswert?

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.

von Klaus W. (mfgkw)


Lesenswert?

Ma_X schrieb:
> mir fällt kein fall ein, in dem das sinn macht :(

Macht nix, dann brauchst du es auch noch nicht.

von Karl H. (kbuchegg)


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**

von Thomas K (Gast)


Lesenswert?

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

von Ma_X (Gast)


Lesenswert?

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!

von Shuzz (Gast)


Lesenswert?

Im Prinzip ist "char **" die Analogie zu einem String-Array in anderen 
Sprachen wie z.B. JAVA.

von Karl H. (kbuchegg)


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.

von (prx) A. K. (prx)


Lesenswert?

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.

von Shuzz (Gast)


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.

von Karl H. (kbuchegg)


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.

von Klaus W. (mfgkw)


Lesenswert?

> ... "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
Noch kein Account? Hier anmelden.