# [C++] Zeiger als Übergabeparameter



## SeeSharpNewBee (29. Oktober 2007)

Hi,

ich beschäftige mich gerade mit C++ und arbeite ein paar kleine Übungen durch. Im jetzigen Kaptiel gehts um Zeiger, Arrays, usw.

Es geht hier weniger um ein Problem, als darum das mir bitte jemand sagen kann ob ich das jetzt verstanden hab und ob das kleine Programm das tut was ich eigentlich vorhabe!

Was das Programm jetzt machen soll:

Ich befasse mich gerade mit Zeigern und Arrays, und ich möchte jetzt wie im Buch empfohlen nicht das Array per "call  by value" sondern per "call by reference" übergeben, also nur den Zeiger auf das Erste Element an die Methode übergeben, und diese soll dann den Text auf die Console schreiben.

Wird bei meinem Programm jetzt wirklich nur der Zeiger übergeben? Danke!


```
#include <iostream>
using namespace std;

void writeToConsole(char* input, int elements);

int main(void) {
	
	char teststring[] = "Heute ist ein schöner Tag!\n";
	
	writeToConsole(&teststring[0], sizeof(teststring)/sizeof(teststring[0]));
	
	return 0;
}

void writeToConsole(char* input, int elements) {
	
	for(int i=0;i<elements;i++)
	{
		cout<<input[i];
	}
}
```


----------



## radazong (29. Oktober 2007)

Hallo!
Ja, es wird der Zeiger auf das erste Element des Array übergeben. Allerdings ist deine Schreibweise etwas umständlich. Denn der Name des Arrays, ohne Index, ist ein Zeiger auf das erste Element. Zusätzlich ist deine Division des ersten Elements durch die Gesamtgröße deines char-Arrays überflüssig, da ein char genau 1Byte groß ist. Somit ist Größe/1 äquivalent zu Größe. Also kannst du deine Funktion wie folgt vereinfachen:


```
writeToConsole(teststring, sizeof(teststring));
```

Aber das sind ja nur unwichtige Feinheiten, funktionieren tut dein Code genauso  . Sobald du einen Zeiger auf etwas übergibst, wird ja keine Kopie erzeugt, sondern es wird nur die Speicheradresse des Objektes übergeben. Somit erfüllt dein Code seinen Zweck.

Greetz


----------



## SeeSharpNewBee (30. Oktober 2007)

Danke für deine Antwort!

Jetzt hab ich noch eine Frage, und zwar:


```
writeToConsole(teststring, sizeof(teststring));

void writeToConsole(char* input, int elements) {
	
	for(int i=0;i<elements;i++)
	{
		cout<<input[i];
	}
}
```

übergibt den Zeiger auf das erste Element an die Methode, warum muss ich aber bei


```
int a=100;

writeToConsole(&a);

void writeToConsole(int* input) {
	cout<<*input<<endl;
}
```

die Zeigeradresse mit *&* übergeben, und beim Array nicht?


----------



## radazong (30. Oktober 2007)

Hallo!

Naja, dein Array hättest du auch wie folgt deklarieren können:


```
const char* Teststring="Heute ist ein schöner Tag!\n"
```

Also handelt es sich dabei schon um einen Zeiger auf eine Zeichenkette. Vielleicht ist diese Schreibweise ja etwas klarer? Der Name eines Zeigers enthält die Adresse des Objektes auf das er zeigt. Wenn du also den Zeiger OHNE Dereferenzierungsoperator ( *ptr) übergibst, übergibst du also automatisch seine Adresse.
Wenn du jedoch keinen Zeiger, sondern ein Objekt deklarierst, so übergibst du bei Argumentübergabe des Namens nicht die Adresse, sondern den Wert des Objektes. Auf die Speicheradresse von Objekten greifst du eben mit dem ArdressOperator (&obj) zu.
Hoffe ich konnte es dir soweit verständlich erläutern,

Gruß


----------



## Teambeta (30. Oktober 2007)

radazong hat gesagt.:


> Hallo!
> Ja, es wird der Zeiger auf das erste Element des Array übergeben. Allerdings ist deine Schreibweise etwas umständlich. Denn der Name des Arrays, ohne Index, ist ein Zeiger auf das erste Element. Zusätzlich ist deine Division des ersten Elements durch die Gesamtgröße deines char-Arrays überflüssig, da ein char genau 1Byte groß ist. Somit ist Größe/1 äquivalent zu Größe. Also kannst du deine Funktion wie folgt vereinfachen:
> 
> 
> ...



Zu beachten ist, das die Größe des Zeigers nicht der Länge des Textens entspricht.

Ein Zeiger ist 4 Bytes groß.

Verwende strlen um die Länge des Textes ausfindig zu machen.


----------



## radazong (31. Oktober 2007)

Hallo.

Ups, Mist wollt ich natürlich keinen erzählen - Teambeta hat natürlich recht.
Sorry.

Gruß


----------

