2 Stimmen

Zuweisung eines Array-Namens an einen Zeiger auf ein Array von Zeichen

Warum bekomme ich eine Warnung, wenn ich dies tue?

char (*arr_ptr)[];
char str[] = "string";

arr_ptr = str;

Die Warnung lautet:

assignment from incompatible pointer type

Aber wenn ich die Zuordnung ändere in:

arr_ptr = &str;

Die Warnung verschwindet. Ich dachte str , &str et &str[0] waren alle gleich. Wie also würde str o &str[0] unvereinbar sein?

Ich denke, mein Code wird von GCC kompiliert, da ich es auf TextMate ausgeführt wird.

2voto

AusCBloke Punkte 17674

In C, str , &str y &str[0] beziehen sich auf dieselbe Adresse - das Label eines Arrays ist einfach eine Möglichkeit, sich auf die Adresse des Beginns eines zusammenhängenden Speicherblocks zu beziehen. str y &str sind jedoch offensichtlich von unterschiedlicher Art, &str geartet char (*)[] .

Wenn Sie wollen arr_ptr a punto a "string" müssen Sie nur tun:

char *arr_ptr = str;

arr_ptr ist einfach vom Typ char* einen einstufigen Zeiger auf char .

EDIT: Für den Fall, dass ich die Frage versehentlich umgangen habe, der Grund, warum die Zuweisung von &str a char (*arr_ptr)[] beseitigt den Fehler aufgrund der Tatsache, dass &str ist vom Typ char (*)[] et str ist nur vom Typ char[] (die bis zu folgenden Werten zerfallen kann char* ).

1voto

glglgl Punkte 84928

Ich dachte str , &str y &str[0] waren alle gleich.

Nein. str es &str[0] - bezeichnen beide einen Zeiger auf das erste Array-Element.

&str zeigt auf dieselbe Stelle, ist aber ein Zeiger auf das gesamte Array.

Der Unterschied ist der Typ, wenn Sie den Zeiger dereferenzieren.

Versuchen Sie

printf("%d %d %d",
       (int)sizeof(*str),
       (int)sizeof(*(&str)),
       (int)sizeof(*(&str[0])));

.

0voto

Sangeeth Saravanaraj Punkte 15597

Ich vermute, Sie wollten Folgendes erreichen:

#include <stdio.h>

int main()
{
    char *arr_ptr;
    char str[] = "string";

    arr_ptr = str;

    printf("%s \n", arr_ptr);
    printf("%s \n", str);

    return 0;
}

Das folgende Programm fügt eine weitere Dimension für Ihr Verständnis hinzu.

int main()
{
    char **arr_ptr;
    char *str[] = {"string1", "string2", "string3"};
    int i;

    arr_ptr = str;

    for (i=0 ; i<3 ; i++) {
        printf("%s \n", arr_ptr[i]);
        printf("%s \n", str[i]);
    }

    return 0;
}

Ich hoffe, das hilft!

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X