Warum kann ich nicht zuweisen einer array-Zeiger direkt in C?
Habe ich das folgende Programm. Allerdings kann ich nicht verstehen, warum ich muss übergeben Sie die Adresse des Arrays. Wenn Sie beide zeigen auf die gleiche Adresse. Das ist die Adresse des ersten Elements des Arrays von int.
Ich bekomme eine Warnung wenn ich versuchen und tun dies, "assignment from incompatible pointer type":
ptr = var;
Kompletten source-code:
void print_values(int (*ptr)[5])
{
size_t i = 0;
for(i = 0; i < 5; i++) {
printf("%d: [ %d ]\n", i, (*ptr)[i]);
}
}
int main(void)
{
/* declare a pointer to an array integers */
int (*ptr)[5] = NULL;
/* array of integers */
int var[] = {1, 2, 3, 4, 5};
/* assign the address of where the array is pointing to (first element) */
ptr = &var;
/* Both are pointing to the exact same address */
printf("var [ %p ]\n",(void*)var);
printf("&var [ %p ]\n", (void*)&var);
print_values(ptr);
return 0;
}
Ich kompilieren Sie den code mit gcc 4.4.4 c89 -Wall -Wextra -O0
- Ich habe versucht zu formulieren, Ihren Titel, denn es war bedeutungslos. Bitte überprüfen, ob ich hob den Kern des Problems richtig.
- Ich denke, dein Titel klingt besser als meine. Danke.
- Sie ein code-snippet kompiliert einwandfrei. Meinst du Sie würden eine Fehlermeldung erhalten, wenn Sie Hinzugefügt
ptr = var
zu main?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es ist eine Reine Typ-Frage.
In den meisten Ausdruck Kontexten der name eines Arrays (wie
var
) zerfällt zu einem Zeiger auf das erste element des array, und nicht einen Zeiger auf das array. [Hinweis: dies bedeutet nicht, dassvar
ist ein Zeiger - es sehr viel nicht ein Zeiger - es ist nur verhält wie ein Zeiger auf das erste element des Arrays in den meisten Ausdrücke.]Dies bedeutet, dass in einem Ausdruck
var
normalerweise zerfällt zu einem Zeiger auf einint
, nicht ein Zeiger auf ein array vonint
.Als der operand die Adresse-von-operator (
&
) ist ein Kontext, in dem dieser Zerfall der Regel nicht gelten (die andere ist eine als operand dersizeof
Betreiber). In diesem Fall ist die Art der&var
leitet sich direkt aus der Art dervar
so der Typ pointer to array 5int
.Ja, die Zeiger haben die gleiche Adresse mit dem Wert (die Adresse eines arrays erste element ist die Adresse des array selbst), aber Sie haben unterschiedliche Typen (
int*
vsint(*)[5]
), so sind nicht kompatibel, in der Zuordnung.ISO/IEC 9899:1999 6.3.2.1/4:
int
ist, und kein array vonint
.C ist eine stark typisierte Sprache. Wenn eine Funktion erwartet einen parameter vom Typ
int *
, müssen Sie ein argument des Typsint *
. Nichtdouble *
, nichtchar *
, aberint *
. Auch wenn der tatsächliche numerische Adresse, die in jenendouble *
oderchar *
ist "das gleiche" wie die, die Sie wollen, zu passieren, es immer noch nicht nichts ändern - Sie haben noch, um eineint *
. Die Sprache verhindert, dass Sie mit übergabe des Werts der falsche Typ.Dies ist genau das, was passiert in Ihrem Fall. Die Funktion nimmt einen parameter vom Typ
int (*)[5]
. Das bedeutet, dass Sie übergeben das argument von diesem Typ. Die übergabe einerint *
statt, ist nicht erlaubt. Ob die Adresse ist die gleiche, macht keinen Unterschied.var
selbst ist ein(*int)
zeigt auf das erste element im array. Zeiger und arrays in C sehr ähnlich. Ändernint (*ptr)[5] = NULL;
zuint* ptr = NULL;
undptr = &var;
zuptr = var;
Was ich sagen kann, Sie sind in der Zuweisung einer array-pointer (
var
) auf einen Zeiger zeigt auf ein array mit Zeiger ((*ptr)[5]
), so dass ist, warum man diese Warnung.Stattdessen versuchen Sie es mit