Alex schrieb:
> Wie ich sehe, ist der array in beiden weisen komplett übergeben.
Falsche Schlussfolgerung.
> Wann übergibt man normalerweise einen Array einfach nur den Array und
> wann als pointer?
Arrays werden als Parameter niemals per Kopie übergeben, sondern immer
als Zeiger.
GEKU schrieb:
> Alex schrieb:
>> printf("address: %zu\n", &array);
>> printf("address: %zu\n", &array2);
>
> Liegt da ein Fehler im Code vor: %zu sollte %x sein, oder?
Beides ist falsch. Es müsste %p sein, für (void-)Pointer. %zu wäre ein
size_t in dezimal, %x ein unsigned int in hexadezimal.
> array liefert einen Zeiger auf den Anfang des Arrays.
> &array[0] liefert einen Zeiger auf den ersten Eintrag des Arrays, und
> dieser steht am Anfang des Arrays, somit sollten die gleichen Adressen
> ausgegeben werden, wenn nicht %zu verwendet worden wäre.
array und &array[0] liefern beide exakt den gleichen Zeiger - einen auf
das erste Element. Mit %zu hat das überhaupt nichts zu tun.
Dass die Werte unterschiedlich sind, liegt daran, dass
1 | printf("address: %zu\n", &array);
|
2 | printf("address: %zu\n", &array2);
|
die Adressen der beiden Zeiger selbst ausgibt, nicht die Adresse des
Arrays bzw. die des ersten Elements, wie deine beiden Vorredner schon
richtig erklärt haben. Es hätte richtig heißen müssen:
1 | printf("address: %p\n", (void*)array);
|
2 | printf("address: %p\n", (void*)array2);
|
Da sollte dann der gleiche Wert angezeigt werden.
Alex schrieb:
> writeAddress(array, &array[0]);
wird beim ersten Parameter automatisch die Adresse des ersten Elements
übergeben. Man sagt, dass das Array in einen Zeiger auf sein erstes
Element "zerfällt". Das erste Argument ist also exakt das gleiche wie
&array[0], entspricht also zu 100% dem zweiten. Man darf sich auch nicht
von dem [] im Parameter täuschen lassen. uint8_t array[] ist als
Parameter (und nur dort) exakt das gleiche wie uint8_t * array.