Gibt es eine andere Möglichkeit, nur Zeiger zu manipulieren?
Nein, denn animal
ist kein Zeiger. animal
ist ein Array. Wenn Sie es als Argument an die Funktion übergeben, wird es zerfällt auf einen Zeiger auf sein erstes Element, so als ob Sie gesagt hätten &animal[0]
.
Auch wenn Sie einen Zeiger verwenden und einen Zeiger auf ihn in funct
wird es trotzdem nicht funktionieren:
void funct(unsigned char** elf)
{
unsigned char fish[2] = { 3, 4 };
*elf = fish; // oh no!
}
int main()
{
unsigned char animal[2] = { 1, 2 };
unsigned char* animal_ptr = animal;
funct(&animal_ptr);
}
Nach der Zeile mit der Aufschrift "Oh nein!" wird die fish
Array hört auf zu existieren; es verschwindet, wenn funct
zurück, weil es sich um eine lokale Variable handelt. Sie müssten sie statisch machen oder dynamisch zuweisen, damit sie nach der Rückkehr der Funktion noch existiert.
Trotzdem ist es nicht dasselbe wie das, was Sie wollen, denn es ändert sich nie animal
; es ändert sich nur dort, wo animal_ptr
zeigt auf.
Wenn Sie zwei Arrays haben und den Inhalt des einen Arrays in das andere kopieren wollen, müssen Sie memcpy
(oder rollen Sie Ihr eigenes memcpy
-ähnliche Funktion, die Array-Elemente in einer Schleife oder nacheinander oder wie auch immer kopiert).
0 Stimmen
Außerdem gibt es doppelte Umleitung, Verweise und Makros. Und bitte, verwenden Sie mehr Leerzeichen für die Identifizierung.
0 Stimmen
Nein, das geht nicht, indem man einfach Zeiger manipuliert, und zwar aus 2 Gründen: 1)
animal
ist ein Array, kein Zeiger (daher kann man ihm keinen Zeiger zuweisen), und 2) der Inhalt vonfish
aufhören zu existieren, sobald Sie vonfunct
Selbst wenn Sie also irgendwie auf sie verweisen würden, wären sie nicht mehr gültig, sobald die Funktion zurückkehrt.0 Stimmen
@David Sie könnten es hacken, indem Sie Fisch als
const
(oder sogarstatic
?), so dass es auf .rdata verweist, das gültig bleibt, wenn Sie die Funktion beenden. Aber ich würde es vermeiden.0 Stimmen
@ruslik müsste es statisch sein.
const
bedeutet nur, dass der Wert konstant ist, nicht, dass er gültig ist, sobald der umschließende Block verlassen wird.