Ich studiere für morgen ein Finale in C und habe eine Frage bezüglich der Größe des Operators.
Nehmen wir an, die Größe eines int
ist 32
Bits und ein Zeiger ist 64
Bits.
Wenn es eine Funktion gab:
%Vor% Da zap
ein Zeiger ist, würde foo
8
zurückgeben, da so viele Bytes benötigt werden, um diesen bestimmten Zeiger zu speichern. Mit dem folgenden Code jedoch:
i
wäre 6 * sizeof(int)
= 6 * 4
= 24
Warum gibt sizeof(zip)
die Anzahl der Elemente mal der Größe jedes Elements zurück, während sizeof(zap)
die Größe eines Zeigers zurückgibt? Ist die Größe von zap
nicht angegeben und zip
nicht? Der Compiler weiß , dass zip
6
elements ist, aber keine Ahnung hat, wie groß zap
sein kann.
Dies ist eine Art Asymmetrie in der C-Syntax. In C ist es nicht möglich, ein Array an eine Funktion zu übergeben. Wenn Sie also die Array-Syntax in einer Funktionsdeklaration für einen der Parameter verwenden, liest der Compiler sie stattdessen als Zeiger.
In C wird das Array in den meisten Fällen, wenn Sie ein Array in einem Ausdruck verwenden, implizit in einen Zeiger auf sein erstes Element konvertiert, und genau das passiert zum Beispiel, wenn Sie eine Funktion aufrufen. Im folgenden Code:
%Vor%Das Array wird in einen Zeiger auf das erste Element konvertiert, und genau das erhält die Funktion.
Diese Regel der Implizierungskonvertierung wird jedoch nicht immer angewendet. Wie Sie zum Beispiel herausgefunden haben, arbeitet der Operator sizeof
im Array, und sogar der Operator &
(Adresse-von) arbeitet am ursprünglichen Array (d. H.% Co_de%).
Eine Funktion in C kann ein Array nicht als Parameter empfangen, es kann nur einen Zeiger auf das erste Element oder einen Zeiger auf ein Array empfangen ... oder Sie müssen das Array in eine Struktur einfügen.
Auch wenn Sie in der Funktionsdeklaration eine Zahl zwischen die Klammern setzen ...
%Vor%Diese Zahl wird vom Compiler vollständig ignoriert ... diese Deklaration für den Compiler ist völlig äquivalent zu
%Vor%und zum Beispiel wird das Aufrufen eines Arrays mit einer anderen Größe auch keinen Fehler auslösen ...
%Vor%(eigentlich ein Compiler MAY gibt eine Warnung, aber der Code ist absolut legal C und muss akzeptiert werden, wenn der Compiler dem Standard folgt)
Wenn Sie denken, dass diese Regel über Arrays in Funktionsargumenten seltsam ist, stimme ich zu, aber so ist die C-Sprache definiert.
Weil zip ein Array ist und der Compiler seine Größe bei Kompilierzeit kennt. Es ist nur ein Fall der Verwendung derselben Notation für zwei verschiedene Dinge, etwas, das in C ziemlich üblich ist.
%Vor%entspricht vollständig
%Vor%Der Compiler hat keine Ahnung, wie groß der Zap sein könnte (so dass er die Aufgabe hat, den Programmierer zu finden).
zip
ist ein Speicherblock von 6 * sizeof(int)
, also hat er eine Größe von 24 (auf Ihrer Architektur).
zap
(es könnte auch in Ihrer Funktionsdeklaration als int *zap
geschrieben werden), kann jedoch auf eine beliebige Speicheradresse verweisen, und der Compiler kann nicht wissen, wie viel Speicherplatz ab dieser (oder sogar dieser) Adresse zugewiesen wurde.
Die Größe von zip
ist zur Kompilierzeit bekannt und die Größe von zap
nicht. Deshalb erhalten Sie die Größe eines Zeigers auf sizeof(zap)
und die Größe des Arrays auf sizeof(zip)
.
Weil zip ein Array ist und der Compiler seine Größe bei Kompilierzeit kennt. Es ist nur ein Fall der Verwendung derselben Notation für zwei verschiedene Dinge, etwas, das in C ziemlich üblich ist.
%Vor%entspricht vollständig
%Vor%Der Compiler hat keine Ahnung, wie groß der Zap sein könnte (so dass er die Aufgabe hat, den Programmierer zu finden).
Ich studiere für morgen ein Finale in C und habe eine Frage bezüglich der Größe des Operators.
Nehmen wir an, die Größe eines %code% ist %code% Bits und ein Zeiger ist %code% Bits.
Wenn es eine Funktion gab:
%Vor%Da %code% ein Zeiger ist, würde %code% %code% zurückgeben, da so viele Bytes benötigt werden, um diesen bestimmten Zeiger zu speichern. Mit dem folgenden Code jedoch:
%Vor%%code% wäre %code% = %code% = %code%
Warum gibt %code% die Anzahl der Elemente mal der Größe jedes Elements zurück, während %code% die Größe eines Zeigers zurückgibt? Ist die Größe von %code% nicht angegeben und %code% nicht? Der Compiler weiß , dass %code% %code% elements ist, aber keine Ahnung hat, wie groß %code% sein kann.
%code% ist ein Speicherblock von %code% , also hat er eine Größe von 24 (auf Ihrer Architektur). %code% (es könnte auch in Ihrer Funktionsdeklaration als %code% geschrieben werden), kann jedoch auf eine beliebige Speicheradresse verweisen, und der Compiler kann nicht wissen, wie viel Speicherplatz ab dieser (oder sogar dieser) Adresse zugewiesen wurde.
Die Größe von %code% ist zur Kompilierzeit bekannt und die Größe von %code% nicht. Deshalb erhalten Sie die Größe eines Zeigers auf %code% und die Größe des Arrays auf %code% .
Es gibt einige Situationen, in denen Arrays zu Zeigern zerfallen. Funktionsaufrufe gehören dazu.
weil es statisch mit 6 Elementen initialisiert wurde.
Dies ist eine Art Asymmetrie in der C-Syntax. In C ist es nicht möglich, ein Array an eine Funktion zu übergeben. Wenn Sie also die Array-Syntax in einer Funktionsdeklaration für einen der Parameter verwenden, liest der Compiler sie stattdessen als Zeiger.
In C wird das Array in den meisten Fällen, wenn Sie ein Array in einem Ausdruck verwenden, implizit in einen Zeiger auf sein erstes Element konvertiert, und genau das passiert zum Beispiel, wenn Sie eine Funktion aufrufen. Im folgenden Code:
%Vor%Das Array wird in einen Zeiger auf das erste Element konvertiert, und genau das erhält die Funktion.
Diese Regel der Implizierungskonvertierung wird jedoch nicht immer angewendet. Wie Sie zum Beispiel herausgefunden haben, arbeitet der Operator %code% im Array, und sogar der Operator %code% (Adresse-von) arbeitet am ursprünglichen Array (d. H.% Co_de%).
Eine Funktion in C kann ein Array nicht als Parameter empfangen, es kann nur einen Zeiger auf das erste Element oder einen Zeiger auf ein Array empfangen ... oder Sie müssen das Array in eine Struktur einfügen.
Auch wenn Sie in der Funktionsdeklaration eine Zahl zwischen die Klammern setzen ...
%Vor%Diese Zahl wird vom Compiler vollständig ignoriert ... diese Deklaration für den Compiler ist völlig äquivalent zu
%Vor%und zum Beispiel wird das Aufrufen eines Arrays mit einer anderen Größe auch keinen Fehler auslösen ...
%Vor%(eigentlich ein Compiler MAY gibt eine Warnung, aber der Code ist absolut legal C und muss akzeptiert werden, wenn der Compiler dem Standard folgt)
Wenn Sie denken, dass diese Regel über Arrays in Funktionsargumenten seltsam ist, stimme ich zu, aber so ist die C-Sprache definiert.
Tags und Links c