Warum kann ich ein Array nicht direkt dem Zeiger in C zuweisen?

7

Ich habe folgendes Programm. Ich kann jedoch nicht verstehen, warum ich die Adresse des Arrays übergeben muss. Wenn beide auf dieselbe Adresse zeigen. Welches ist die Adresse des ersten Elements des Arrays von Int.

Ich bekomme eine Warnung, wenn ich versuche, diese "Zuweisung vom inkompatiblen Zeigertyp" zu machen:

%Vor%

Kompletter Quellcode:

%Vor%

Ich kompiliere den Code mit gcc 4.4.4 c89 -Wall -Wextra -O0

    
ant2009 17.08.2010, 16:03
quelle

4 Antworten

17

Es ist ein reines Typproblem.

In den meisten Ausdruckkontexten wird der Name eines Arrays (wie zum Beispiel var ) zu einem Zeiger auf das ursprüngliche Element des Arrays, nicht zu einem Zeiger auf das Array. [Beachten Sie, dass dies nicht bedeutet, dass var ein Zeiger ist - es ist sehr viel nicht ein Zeiger - es verhält sich einfach wie ein Zeiger auf das erste Element des Array in den meisten Ausdrücken.]

Dies bedeutet, dass in einem Ausdruck var normalerweise zu einem Zeiger auf ein int abklingt und nicht auf ein Array von int .

Da der Operand des Operanden address-of ( & ) ein Kontext ist, in dem diese Abklingregel nicht gilt (der andere ist der Operand des Operators sizeof ). In diesem Fall wird der Typ von &var direkt vom Typ von var abgeleitet, so dass der Typ Zeiger auf ein Array von 5 int ist.

Ja, die Zeiger haben den gleichen Adresswert (die Adresse eines ersten Array-Elements ist die Adresse des Arrays selbst), aber sie haben unterschiedliche Typen ( int* vs int(*)[5] ), also sind sie nicht kompatibel Zuordnung.

ISO / IEC 9899: 1999 6.3.2.1/4:

  

Außer wenn es der Operand des sizeof Operators oder des unären & Operators ist oder ein String-Literal zur Initialisierung eines Arrays verwendet wird, ein Ausdruck vom Typ "Array of type "wird in einen Ausdruck vom Typ" Zeiger auf Typ "konvertiert, der auf das Anfangselement des Array-Objekts zeigt und kein L-Wert ist. ...

    
Charles Bailey 17.08.2010, 16:09
quelle
4

C ist eine stark typisierte Sprache. Wenn eine Funktion einen Parameter vom Typ int * erwartet, müssen Sie ein Argument vom Typ int * übergeben. Nicht double * , nicht char * , aber int * . Selbst wenn die tatsächliche numerische Adresse in diesen double * oder char * "die gleiche" ist wie die, die Sie übergeben möchten, ändert sich nichts daran - Sie müssen noch eine int * übergeben. Die Sprache verbietet es, den Wert des falschen Typs zu übergeben.

Genau das passiert in Ihrem Fall. Die Funktion nimmt einen Parameter vom Typ int (*)[5] . Das bedeutet, dass Sie das Argument dieses Typs übergeben müssen. Das Übergeben eines int * ist stattdessen nicht erlaubt. Ob die Adresse dieselbe ist, macht keinen Unterschied.

    
AnT 17.08.2010 16:22
quelle
3

var selbst ist ein (*int) , das auf das erste Element in Ihrem Array verweist. Zeiger und Arrays in C sind extrem ähnlich. Ändern Sie int (*ptr)[5] = NULL; in int* ptr = NULL; und ptr = &var; in ptr = var;

    
Ian Wetherbee 17.08.2010 16:09
quelle
1

Nach dem, was ich Ihnen sagen kann, weisen Sie einen Zeiger ( var ) auf einen Zeiger zu, der auf einen Zeiger ( (*ptr)[5] ) zeigt. Deshalb erhalten Sie diese Warnung.

Versuchen Sie stattdessen,

zu verwenden %Vor%     
Ultimate Gobblement 17.08.2010 16:10
quelle

Tags und Links