Matthias Lipinsky schrieb:
>>void foo( T* daten )
>>{
>> benutze das Array, von dem die Startadresse in daten steht
>>}
>>
>>void bar()
>>{
>> foo( daten );
>>}
>
>
> Und wenn foo nun nicht das gesamte Array, sondern nur ein Element
> bedienen soll, dann doch so, oder?
>
>1 | > void bar()
|
2 | > {
|
3 | > foo( daten[5] );
|
4 | > }
|
5 | >
|
In dem Fall wird dann daten[5] als Kopie an foo übergeben (welche dann
klarerweise ein T bekommt
1 | void foo( T wert )
|
2 | {
|
3 | mach was
|
4 | }
|
Bei Strukturen kann das in Ordnung sein, meist übergibt man jedoch einen
Pointer auf das Strukturelement um sich die oft unnötige Kopie eines
Strukturelements zu ersparen
1 | void foo( T * wert )
|
2 | {
|
3 | // mach was mit *wert
|
4 | }
|
5 |
|
6 | void bar()
|
7 | {
|
8 | foo( &daten[5] );
|
9 | }
|
Möchte man zum Ausdruck bringen, dass nur deswegen ein Pointer übergeben
wird, weil man den Aufrufer nicht dazu zwingen will eine Kopie seiner
Daten zu erstellen aber ansonsten hat die Funktion nicht die Absicht die
Daten selbst zu verändern, dann sollte man const benutzen
1 | void foo( const T * wert )
|
2 | {
|
3 | // mach was mit *wert
|
4 | // aber jeden Versuch hier *wert zu verändern wird
|
5 | // der Compiler mit einem Error quittieren.
|
6 | // -> ergo: solange hier nicht wie wild rumgecastet wird
|
7 | // hat der Aufrufer die Absicherung, dass sich seine Daten
|
8 | // nicht verändern, selbst wenn er einen Pointer darauf
|
9 | // herausrückt
|
10 | }
|
11 |
|
12 | void bar()
|
13 | {
|
14 | foo( &daten[5] );
|
15 | }
|