Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

TigerClaw25

unregistriert

1

02.08.2017, 17:26

Parameterliste der main-Funktion

Hallo Zusammen,
ich habe eine Frage zu Zeigern und der Parameterliste der main-Funktion.

char-Arrays und Zeiger sind mir bekannt. Wenn ich beispielsweise die Anfangsadresse des char-Arrays einem Zeiger zuweisen möchte, tue ich das so: ptr = &charAuswahl[0] oder ptr=charAuswahl.

Nun habe ich folgendes Problem.

Ich habe ein Programm und übergebe über das Linux-Terminal drei char-Parameter. Demnach bezieht sich meine Frage auf "main(int argc, char **argv)".

Nun habe ich eine Funktion m_t m_open (const char *name, int FLAG);. Dieser wird der zweite Parameter, also argv[1] übergeben, also wie folgt:

m_open(argv[1], FLAG1 | ... ,NULL);

Jetzt verstehe ich nur nicht, wieso es argv[1] ist. Ich habe in der main einen Zeiger auf einen Zeiger. Darüber hinaus ist die Tatsache, dass die Indexangabe [1] einen vollständigen Charakter und nicht nur einen Buchstaben enthält, etwas gewöhnungsbedürftig. Ich verstehe daher den Aufruf nicht. Mit "[]" dereferenziere ich ersteinmal. Also greife ich auf den Wert zu, in dem Fall also einem String, und nicht wie bei einfachen Arrays auf einen Buchstaben oder einen INdex-wert. Soweit verstehe ich das auch. Ich hätte auch (argv+1) wie bei Pointern wahrscheinlich schreiben können. Aber habe ich nicht einen Zeiger auf Zeiger in der main? Müsste ich dann nicht irgendwie doppelt dereferenzieren?

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

2

02.08.2017, 17:52

**argv ist ein Array von Pointern auf char*. Sprich ein Array von C-Strings. Folglich ist jeder Eintrag in diesem Array ein char*. Also genau das, was m_open als Parameter will.

Ein Charakter ist ein Buchstabe.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

3

02.08.2017, 17:53

Was meinst du mit „vollständigen Character“ und „Buchstabe“? Ich denke, du bringst da mal wieder was durcheinander.
Wenn du doppelt dereferenzieren würdest, bekämst du nur einen einzigen char.
char* zeigt auf das erste Zeichen eines Strings, d.h. eine Sequenz von Zeichen. char** zeigt auf den ersten String aus einer Sequenz von Strings.

TigerClaw25

unregistriert

4

02.08.2017, 19:38

Also habe ich im Prinzip drei Arrays,wobei jedes davon ein String ist. Auf die Anfangs-Adresse zeigt dann ein Zeigerarray y[] und darauf dann ein Zeiger x?

Beispiel:
char *y[]={"text1\n", "text2\n"} ;
char **x=y;

Korrekt? Mit *x gebe ich dann von [1] aus, da es äquivalent jst mit *(x+1), also auch x[1].

Was mich unter anderem auch verwirrt ist **argv statt *argv[]

CentuCore

Frischling

Beiträge: 43

Wohnort: Wien

  • Private Nachricht senden

5

02.08.2017, 20:41

"int *i[]" ist dasselbe wie "int **i".
Der einzige Unterschied ist, dass du durch die Array-Schreibweise zum Beispiel zur Compilezeit die Arraygröße kennst.
Dadurch ist dann sowas möglich:

C-/C++-Quelltext

1
2
3
4
5
6
int *i[3];
int num = sizeof(i) / sizeof(i[0]); //num = 3

//Wenn du stattdessen sowas schreibst kommt dann halt Blödsinn raus.
int **i2;
int num2 = sizeof(i) / sizeof(i[0]); //num = 1


Manche Leute mögen die []-Schreibweise da damit verdeutlicht wird, dass eine Funktion ein Array erwartet.
Wobei man dann auch gleich std::vector& verwenden könnte.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

6

02.08.2017, 20:45

"int *i[]" ist dasselbe wie "int **i".

Disclaimer: Das gilt nur in der Parameterliste einer Funktion. Im Allgemeinen ist int* [] etwas komplett anderes als int**. Aber in der Parameterliste einer Funktion macht [] effektiv das selbe wie *.

Also

C-/C++-Quelltext

1
int* p;

und

C-/C++-Quelltext

1
int a[];

sind zwei komplett verschiedene Dinge. Aber

C-/C++-Quelltext

1
void f(int* a);

und

C-/C++-Quelltext

1
void f(int a[]);

deklariert in beiden Fällen die selbe Funktion, weil C und C++ eine spezielle Regelung haben die vorschreibt dass [] in Parameterlisten von Funktionen zu * werden. Motivation hinter diesem Verhalten war wohl, zu erreichen dass Arrays immer by-reference übergeben werden.

Einer der Gründe, wenn nicht sogar der Hauptgrund, wieso built-in Arrays leider ziemlich unintuitiv sind...


C-/C++-Quelltext

1
int main(int argc, char* argv[]);

ist also das selbe wie

C-/C++-Quelltext

1
int main(int argc, char** argv);

Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von »dot« (02.08.2017, 20:56)


BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

7

02.08.2017, 21:00

Also habe ich im Prinzip drei Arrays
Wieso 3? Du hast doch offenbar nur argv, also einen.

wobei jedes davon ein String ist
Jein. Ein String ist nicht gleich einem char-Array. Technisch nahezu ( '\0' ist zu beachten!), aber semantisch nicht.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

8

02.08.2017, 21:15

Also habe ich im Prinzip drei Arrays
Wieso 3? Du hast doch offenbar nur argv, also einen.

Er hat weiter oben geschrieben, dass er seinem Programm in der Kommandozeile 3 Parameter übergibt. Deshalb wohl.
Allerdings ist auch das ein Irrtum, denn argv[0] ist normalerweise der Name der ausführbaren Datei, die aufgerufen wird. Also hat er 4 char-Arrays.

Werbeanzeige