Bei der memset() Funktion ist der Pointer auf den Speicher ja das
Wichtigste. So ein schnöder "Buffer" ist aber ggfs völlig uninteressant
und wird von allen möglichen Funktionen verwendet.
Ich schreibe nach links das, was die Funktion eigentlich "interessant"
macht und sich laufend ändert. Und dann in Richtung rechts als nächstes
das, was konstant ist und dann das, was man "halt zum Funktionieren
braucht". So wie die memset() das auch macht: woihn? was? wieviel?
Und bezogen auf die ursprüngliche Frage lautet deshalb die Antwort
"alles möglich, kommt drauf an".
Was zusammen gehört wird direkt hintereinander übergeben:
Eigentliche Daten vor Metadaten, vor Steuerdaten. D.h. zum Beispiel
Pointer vor der Speichergrösse auf die der Pointer zeigt. Metadaten in
der Reihenfolge ihrer gefühlten Wichtigkeit. Steuerdaten, Flags, die das
Verhalten der Funktion steuern zuletzt.
Bei C++ müssen die Parameter mit Default-Werten sowieso ans Ende, da
kann man nicht immer die typische Reihenfolge einhalten.
Unterschiedliche Meinungen gibt es über die Reihenfolge von übergebenen
Daten und zurückgegebenen Daten.
Entweder:
Zurück vor übergeben: f(int *out1, double *out2, int in1, bool in2);
weil das der Reihenfolge bei einem Funktionsaufruf ähnelt out = f(in);
und weil es besser zu C++ Default-Argumenten passt.
Oder:
Übergeben vor zurück f(int in1, bool in2, int *out1, double *out2); weil
es angeblich flüssiger zu lesen ist.
Ich schreibe gerne das Ziel vor der Quelle.
Buffergrössen schreibe ich gerne vor den Buffer, so:
1
int do_something(
2
size_t dst_size, char dst[dst_size],
3
size_t src_size, char src[src_size]
4
);
Obwohl, ich halte mich auch nicht immer daran, und es ist eher weil
"char a[b], size_t b" halt nicht funktioniert, und mir die T x[N]
schreibweise besser gefällt als die T* x schreibweise.
Eine eigene Frage?
Dieser Thread ist über 7 Jahre alt.
Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.