2016-04-04 3 views
1

Arrays in c werden immer als Referenz übergeben und printf ist eine call-by-value-Funktion. Warum übergeben wir Array an die printf-Funktion, um einen String zu drucken?Wenn Arrays immer Call for Reference übergeben werden, wie können Arrays dann an Funktionen wie printf übergeben werden, die streng nach Wert benannt sind?

+1

C Pass immer Wert unter Verwendung erreicht, Arrays einschließlich finden Sie in diesem Beitrag http://stackoverflow.com/questions/22 29498/passing-by-reference-in-c –

Antwort

5

Zuerst werden Arrays nicht als Referenz in C übergeben. Sie Zerfall zu einem Zeiger, der von Wert an die Funktion übergeben wird.
Es gibt keine übergeben durch Verweis in C. Es kann nur mit übergeben Wert übergeben werden.

Wir übergeben Arrays nicht wirklich an printf: es sind die oben erwähnten Zeiger, die wir durch eine implizite Umwandlung (Zerfall) erhalten. Dieser Zeiger kann genauso gut dereferenziert werden, um auf den Inhalt des Arrays zuzugreifen, so dass ein Array "nach Wert" nicht benötigt wird.

+0

Aber wir schreiben * (name_of_array) nicht als Argument für printf, wir schreiben einfach den Namen des Arrays. Ich meine, wir schreiben printf ("% s", name_of_array) anstelle von printf ("% s", * name_of_array). Wie kommt es dann (angesichts der Tatsache, dass das Array zum Zeiger abfällt), ist es entreferenziert? – user6112826

+0

@ user6112826 Das Array wird als Zeiger übergeben. Der Parameter der Funktion für dieses Array ist dann "T * ptr", wobei "T" ein beliebiger Typ ist. Die Funktion kann diesen Zeiger einfach dereferenzieren, indem sie 'ptr [N]' ausführt, wobei 'N' ein beliebiger ganzzahliger Ausdruck wie '5' oder 'i + 2' ist. Sehen Sie sich einfach eine einfache 'printf'-Implementierung an und Sie werden es verstehen. – Downvoter

+0

@ user6112826: Wenn es nicht der Operand der Operatoren 'sizeof' oder unary' & 'ist, behandelt der Compiler' name_of_array' als Zeiger auf das erste Element des Arrays. Siehe [diese Antwort] (http://stackoverflow.com/questions/4607128/in-c-are-arrays-pointers-or-edu-as-pointers/4608421#4608421) für eine detailliertere Erklärung. –

0

Sie übergeben Arrays nicht an printf, stattdessen übergeben Sie die Werte im Array.

int arr[] = {1,2,3}; 
printf("%d",arr); //Undefined behavior(garbage value) 
printf("%d",arr[0]); //will print 1 

Sie können auch einen Zeiger als Argument an eine Funktion übergeben, aber nicht eine Referenz in C

bearbeiten
Bei char* die Zeiger, um alle Zeichen in dem Array zu verkohlen ist kann angezeigt werden, bis die NULL-Zeichen

char* str = "Hello"; 
printf("%s",str); 
+0

'char *' ist ein spezieller Fall, der erwähnt werden sollte. –

+0

Dies ist möglich, wenn Sie ein Array von Zeichen erstellen und den Formatbezeichner% s zum Drucken von Zeichenfolgen verwenden. – user6112826

+0

@ user6112826 Wie von Fiddling Bits erwähnt, ist es ein spezieller Fall. – XZ6H

Verwandte Themen