C Vorbei array von unbekannter Größe auf eine Funktion in einer einzigen Variablen
In C, muss ich übergeben Sie ein array an eine Funktion in einer einzigen Variablen, und ohne zu wissen, wie groß das array sein wird, bevor das Programm ausgeführt wird. Die auf-Papier-Lösung ist ein zusätzliches element in das array, wo man speichern der array-Größe (ich denke, dies wird als "sentinel-Wert"). Ok, aber ich habe Probleme bei der Umsetzung dieser.
Vorbei array[] als Funktion argument scheint nicht zu funktionieren. Ich nehme an, dass ich senden können Sie einen Zeiger auf das erste element, aber wie bekomme ich dann Zugriff auf den rest des Arrays?
- Was ist das problem mit dem übergeben von Arrays als argument?
Du musst angemeldet sein, um einen Kommentar abzugeben.
In C ein array zerfällt zu einem Zeiger auf sein erstes element in den meisten Kontexten:
Nützlich ist, weil die Indizierung von Arrays
a[i]
, ist definiert mit Hilfe der Zeiger-Arithmetik:*(a+i)
.So können Sie die gleichen Operationen auf den Zeiger auf das array.
Trotzdem gibt es einen Nachteil dieser Konsistenz: Sie können nicht übergeben Sie ein array als Wert ohne wickelte Sie in ein
struct
.Nächsten, ein
sentinel
ist ein Ungültiger Wert für den element-Typ als Anschlag verwendet marker, wie für strings, die 0 und für Zeiger meistNULL
.Was Sie eigentlich beschrieben war ein gezählten array, mit der Länge vorangestellt, bei index
((size_t*)a)[-1]
oder so.sizeof
und_Alignof
Operatoren: Wenn der, angewandt auf einen Operanden, der hat array-Typ, das Ergebnis [sizeof
] ist die Gesamtzahl von bytes im array.103) und Fußnote 103 sagt:_Alignof
] die Ausrichtung Voraussetzung für den Typ des Elements.Die Wahl der sentinel-Wert hängt von der Art der Daten, die das array speichert. Für alles was mit einem Mauszeiger, verwenden Sie
NULL
, undNaN
für schwebende Punkte, z.B.:Überprüft jetzt, wo das array endet Beträge zu Fuß auf dem array, bis Sie das sentinel:
Suche nach einem sentinel ist schwieriger, für einige Datentypen (z.B.
int
), aber Sie können dann wählen Sie einen üblichen Wert.Ihnen Iteration über das array, dessen Adresse übergeben als ersten parameter, und aktivieren Sie die Palette, indem Sie die array-Länge übergeben wird, die als der zweite parameter.