2016-03-12 3 views
6

Wie kann char Zeiger mit einer Zeichenfolge (Array von Zeichen) initialisiert werden, aber ein int Zeiger nicht mit einem Array von Ganzzahl?Wie kann ein Char-Zeiger mit einer Zeichenfolge (Array von Zeichen) initialisiert werden, aber ein int-Zeiger nicht mit einem Array von Integer?

Als ich dieses versucht

int* a={1,2,3,4,5}; 

Es gibt eine Fehlermeldung,

error: scalar object ‘a’ requires one element in initializer

Aber

char* name="mikhil" 

funktioniert perfekt.

+1

Sie können dies tun: int a [] = {1,2,3,4,5}; – kvr

+2

_ "Aber char *' name = "mikhil" 'funktioniert perfekt" _ Nein, tut es nicht - es ist falsch in C++ und ** wird nicht kompiliert **. Sprechen wir also über C oder C++? – edmz

Antwort

7

Bei Sie versuchen, ein int * mit

{1,2,3,4,5}; 

es falsch zu initialisieren ist, weil {1,2,3,4,5};, wie sie ist, kein Array von ganzen Zahlen ist. Es ist eine geschweifte Klammer Liste der Initialisierer. Dies kann verwendet werden, um ein int Array zu initialisieren (einzelne Elemente des Arrays, um genau zu sein), aber kein Zeiger. Ein Array ist kein Zeiger und umgekehrt.

Sie können jedoch die Verwendung eines compound literal zu initialisieren ein int *, wie

int * a = (int []){1,2,3,4,5}; 
+1

Funktioniert das nicht nur in C und nicht in C++ –

+1

@KentKostelac Es ist eine gcc (und clang?) Erweiterung in C++, also ist es nicht Standard. Es sieht auch so aus, als ob es einen baumelnden Zeiger hinterlässt. –

+0

Ihre vorgeschlagene Methode gibt den Fehler "Adresse des temporären Arrays übernehmen" –

9

Da dies die Regeln (Standards) der Sprache sind. Es gibt nichts, was Sie sagen, es ist möglich, einen Zeiger mit einem Array wie folgt zu initialisieren, zum Beispiel, ist die folgende auch illegal:

char* name={'m', 'i', 'k', 'h', 'i', 'l', 0}; 

Eine wörtliche Zeichenfolge seine eigene Behandlung bekommt und definiert nicht nur als ein Array von Zeichen.

+0

Sie haben Recht, aber das beantwortet diese spezielle Frage nicht. Es gibt einen grundlegenden Unterschied in der Verwendung des Initialisierers hier. –

2

Für die Bequemlichkeit machen, ermöglicht die Sprache char * (oder vorzugsweise const char *) mit einem String initialisiert werden . Dies ist, weil es eine sehr häufige Verwendung ist, und es seit C möglich war. Sie sollten den Zeichenfolgenwert wirklich nicht ändern (natürlich ist das eine separate Debatte).

Mit einem int, wenn Sie ein int a [5] initialisieren, wird erwartet, dass Sie die Werte ändern können. Die initialisierten Werte werden in Ihr Array kopiert (Compileroptimierungen werden nicht unterstützt), und Sie können sie ändern, wie Sie es für richtig halten. Wenn int * a auf diese Weise initialisiert werden könnte, auf was würde es zeigen? Es ist nicht wirklich klar, so dass der Standard es nicht erlaubt.

1

die Sprache nicht Nullabschluss unterstützen Arrays int, die seit Compiler Zweideutigkeit würde ist, dass die Null-Terminator oder 0 in int-Array ...

es aus dem gleichen Grund zurückzuführen ist, auf die

cout<<anystring; geben komplette Array von Zeichen dh eine vollständige Zeichenfolge und nicht dieses

cout<<a; für einen 1-d int Array a ... infact es gibt eine Fehlermeldung und nicht die komplette 1-d-Array druckt ...

upvote wenn ich irgendwo zufrieden/löste Ihre Anfrage ...

+0

''\ 0'' ist nur ein Zeichen mit dem Wert' 0', das zu 'int' hochgestuft werden kann. Abgesehen davon, sehe ich nicht, wie Null-Terminatoren darauf zutreffen. Das Problem ist, dass '{1, 2, 3}' kein Array ist. –

Verwandte Themen