Forum: Compiler & IDEs Pointer mit *** ?


von Michi (Gast)


Lesenswert?

Wieso wird hier zweimal * verwendet bei **arg und sogar dreimal bei 
***in_arg?


void set_multiport(char *device, int fd, char ***in_arg)
{
char **arg = *in_arg;
char *word, *argument;



oder Ein anderes Beispiel:
1
void get_serial(char *device)
2
{
3
  printf("%s\n",device);
4
}
5
6
  
7
main(int argc, char **argv) {
8
  get_serial(argv[1]);
9
return 0;
10
}

hier hat **argv auch zweimal *, lasse ich eins weg, bekomme ich eine 
Warnung:

test.c: In function 'main':
test.c:16: warning: passing argument 1 of 'get_serial' makes pointer 
from integer without a cast


Soweit ich weiss Zeigt *device nur auf eine Adresse, die scheinbar auch 
mehr als ein Char beinhalten kann, nur wieviele?!


Was habe ich für Möglichkeiten wenn ich C anständig lernen möchte?
Mal abgesehen von Büchern.. gibt es da nicht Kurse etc..?

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Michi schrieb:

> Wieso wird hier zweimal * verwendet bei **arg und sogar dreimal bei
> ***in_arg?
>
>
> void set_multiport(char *device, int fd, char ***in_arg)

Das musst du wohl den Autor von set_multiport() fragen, oder du
schaust dir an, was danach damit passiert.

> main(int argc, char **argv) {

Vielleicht gefällt es dir ja in der "klassischen" Schreibweise
besser:
1
main(int argc, char *argv[]);

Das ist ein Feld von Zeigern, die auf char * (also auf Felder von
Zeichen) zeigen.  Da dieses wiederum selbst an eine Funktion
übergeben wird als Parameter, wird aus dem Feld ein Zeiger.

Ein beispielhafter Aufruf könnte also sein:
1
char p1[] = { 'f', 'o', 'o', 0 };
2
char p2[] = { 'b', 'a', 'r', 0 };
3
4
char *argv[] = { p1, p2 };
5
6
main(2, argv);

Wenn du nun innerhalb von main() das komplette Argument argv so
an eine Funktion weiterreichen willst, dass diese Funktion das
ursprüngliche argv auch noch selbst manipulieren kann, bist du
bei obigem "Dreifach-Sternchen", denn du musst dessen Adresse
übergeben:
1
set_multiport("foo", 42, &argv);

Warum man sowas aber gerade da braucht, ist dem Schnipsel
nicht zu entnehmen.

von Michi (Gast)


Lesenswert?

aaaah, Danke!


puh... das ist garnicht so einfach.

Wie lernt man sowas?

von Nico S. (nico22)


Lesenswert?

Michi schrieb:
> Wie lernt man sowas?

Mit einem anständigen C-Buch.

von DirkB (Gast)


Lesenswert?

Michi schrieb:
> Wie lernt man sowas?

Wie immer: üben, üben, üben (üben <-> programmieren)

von Carsten (Gast)


Lesenswert?

Auf ET-Tutorials.de wird zur Zeit ein Video-Kurs angeboten.
http://ET-Tutorials.de/Mikrocontroller
Der Kurs wird zur Zeit scheinbar noch weiterentwickelt. Ich weiß nicht 
wie tief die noch gehen werden.

von Meister E. (edson)


Lesenswert?

Carsten schrieb:
> Der Kurs wird zur Zeit scheinbar noch weiterentwickelt. Ich weiß nicht
> wie tief die noch gehen werden.

Viel tiefer gehts ja wohl auch nicht ;) Fortgeschrittene 
C-Programmierung aus einem Video erlernen zu wollen zeugt schon von 
mangelndem Sachverstand...

von Carsten (Gast)


Lesenswert?

Ich bin Anfänger und dafür ist es super.
Fortgeschrittenes Programmieren lernt man wohl nur in der Praxis über 
die Jahre.
Aber dahin ist es wohl noch ein weiter Weg. Bin aber noch jung :-)

von Mark B. (markbrandis)


Lesenswert?

Jörg Wunsch schrieb:
> Warum man sowas aber gerade da braucht, ist dem Schnipsel
> nicht zu entnehmen.

Wahrscheinlich braucht man es gar nicht, in dem Sinn als dass man es 
auch hätte einfacher programmieren können. Man kann auch fünffach 
dereferenzieren wenn man will - aber dann erhält man zu Recht die 
Kündigung. ;-)

von ET-Tutorials (Gast)


Lesenswert?

Danke für die Nennung, Carsten.

Der VIDEO-Kurs ist in der Tat für Einsteiger gedacht.

Profis finden im Netz genügend Webseiten mit Projekten in C.
Zudem lernt man Programmierennur durch Programmieren.

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.