Unterschied zwischen char *argv[] und char **argv für das zweite argument von main()
CODE 1
#include<stdio.h>
int main(int argc, char *argv[])
{
int j;
printf("%d", argv[1][0]);
return 0;
}
CODE 2
#include<stdio.h>
int main(int argc, char **argv)
{
int j;
printf("%d", argv[1][0]);
return 0;
}
CODE 1 und CODE 2 beide geben die gleiche Leistung. aber argument 2 der main-Funktion in CODE 1 und CODE 2 sind unterschiedlich. Array von Pointern erstellt über Daten § zur compile-Zeit. argv ist das array von Zeigern. Dann sollten wir deklarieren argument in der main-Funktion als Zeiger auf Zeiger auf Zeichen, d.h., **argv. Wie es richtig ist, zu erklären, wie in CODE 1?
- Der zweite parameter ist nicht anders in irgendeiner Weise so weit wie compiler betroffen ist, ist
char *argv[]
ist nur äquivalent zuchar **argv
. Das ist mehr wie die Materie der am günstigsten gelegene coding style. - mögliche Duplikate von Was soll main() zurückgeben in C und C++?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Grundsätzlich, char* argv[] bedeutet, dass array von char-Zeigern, in der Erwägung, dass char** argv bedeutet Zeiger auf einen char Zeiger.
In jedem array der name des Arrays ist ein Zeiger auf erstes element des Arrays, das heißt, es enthält die Adresse des ersten Elements.
So, in den unten angegebenen code ein, in char-array x, x ist ein Zeiger auf erstes element, '1', das ist ein Zeichen. Es ist also Zeiger auf ein Zeichen.
Und in array arr, arr ist pointer erste element x, das selbst ein Zeiger auf ein Zeichen. So ist es ein Zeiger auf einen anderen Zeiger.
Daher ist x char*, und arr ist " char**".
Während er etwas in einer Funktion, grundlegende Regel ist, dass Sie sagen, die Art von Sache, die Sie erhalten. Also entweder Sie sagen einfach, dass Sie erhalten möchten, char**, oder Sie können auch sagen, char* arr[].
Im ersten Fall, wir brauchen nicht zu denken, nichts zu Komplexes. Wir wissen einfach, wir erhalten ein array von char*. Kennen wir das nicht? So erhalten wir es und verwenden es.
Im zweiten Fall ist es einfacher, wie ich oben erklärt, dass die arr ist ein "char*" * können Sie setzen, wie es die Art und erhalten Sie es sicher. Jetzt weiß das system, Art der Sachen, die wir empfangen haben, können wir auf weitere Elemente an, indem Sie einfach mit array-annotation. Es ist so, wir haben erhielt die Startadresse des Arrays, können wir sicher gehen, um die nächsten Elemente, und wie wir wissen, es geben, wissen wir, was es enthält und wie wir Sie nutzen können, weitere. Wir wissen, dass es enthält Zeiger auf char, so können wir rechtlich Zugriff auf Sie als gut.
char* argv[]
undchar** argv
sind absolut gleichwertig und bedeuten nicht verschiedene Dinge auf alle. Zweitensarr
ist nicht einen Zeiger. Ich wusste nicht, studieren Sie den text in der Nähe genug, um andere spezifische Probleme, aber die sind schon ernst zu garantieren downvote und eine aufrichtige Hoffnung, dass Sie besuchen Sie diese post, bevor andere getäuscht!arr
ist nicht ein Zeiger - vielleicht Kommentar, wasarr
ist und diearr
- ich sehe verschiedene Verwendungen in diese Antwort.Ist es wichtig zu c, dass
char** x
undchar* x[]
zwei Weise zum Ausdruck die gleiche Sache. Beide erklären, dass erhält der parameter einen Zeiger auf ein array von Zeigern. Daran erinnern, dass können Sie immer schreiben:und verwenden Sie dann x identisch.
sizeof
sizeof
erwähnt, die Ed zu Heilen), wo arrays werden nicht äquivalent zu Zeigern, und dass die "array-Einstellung" in der Funktion parameter-Deklarationen (die Frage fragt nach) unterscheidet sich von der (wenn auch Verwandte) das "array " decay" in Ausdrücken. Für Referenzen, Sie konnte zitieren, z.B. Was ist ein moderner Begriff für "array/ - Zeiger äquivalenz"? und Ausnahme array nicht verfaulenden in einen Zeiger?Sie sind genau die gleichen. §5.1.2.2.2 der C11-standard besagt:
Deutlich die Absicht für beide Erklärungen identisch sein. Auf top von, dass, die Regel ist beschrieben in §6.7.6.3/7:
deklarieren ein array wie dieses
macht es const, was bedeutet, dass Sie NICHT haben, KÖNNEN Sie den folgenden code
obwohl der zweite string ist kleiner und sollte passen Sie diese Fehlermeldung erhalten
wenn Sie
**argv
schreiben Siewenn Sie
*argv[]
danngibt Ihnen diese Warnung
so ist es technisch eine kleine Optimierung als wenn du geschrieben hättest
const