www.mikrocontroller.net

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


Autor: Ma_X (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
moin!
ich bin auf das konstrukt

char **a

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

Autor: Daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
pointer auf pointer ;-)

Autor: Ma_X (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ernsthaft?

Autor: Klaus (Gast)
Datum:

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Ma_X (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
mir fällt kein fall ein, in dem das sinn macht :(

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Klaus Wachtler (mfgkw)
Datum:

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

Macht nix, dann brauchst du es auch noch nicht.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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
  void foo( int * i )
  {
    *i = 5;
  }

  int main()
  {
    int j;
    foo( &j );
  }

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)
  char Text1[] = "Hallo World";

  void foo( char* * i )
  {
    *i = Text1;
  }

  int main()
  {
    char * text;

    foo( &text );

    printf( text );
  }

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:
void foo( T * argument )
{
  *argument = ....
}

void Aufrufer()
{
  T  variable;

  foo( &variable );
}

wenn jetzt T zufällig selber wieder ein char* ist, dann ensteht für
void foo( T * argument )
eben
void foo( char* * argument )

und da an dieser Stelle Leerzeichen keine Rolle spielen, ist das 
Äquivalent zu einem char**

Autor: Thomas K (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Ma_X (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Shuzz (Gast)
Datum:

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Shuzz (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.