<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Zeigerprobleme]]></title><description><![CDATA[<p>Hallo zusammen,<br />
ich versuche gerade mich etwas in c++ rein zu arbeiten aber , wie scheinbar ziemlich viele andere, hänge ich bei den Zeigern irgendwie fest. Ich verstehe einfach nicht den Sinn der Zeiger. Ich programmiere seit langer Zeit beruflich in PHP und bin auch in VB relativ fit. Was das Programmieren angeht bin ich also nicht gerade unerfahren. Ich benutze natürlich auch beispielsweise in PHP Referenzen und komme damit gut klar aber die Zeiger in c++ geben mir den Rest. Es liegt sicherlich zum Teil daran, dass ich einige Sachen dabei einfach nur unlogisch finde (wahrscheinlich weil ich nicht ganz dahintersteige).</p>
<p>Beispiel:</p>
<pre><code class="language-cpp">int a = 10;
int *p;

p = &amp;a;

cout &lt;&lt; *p; // gibt 10 aus
</code></pre>
<p>So weit, so gut.<br />
Jetzt kommt etwas, dass sich meiner Logik verschliesst:</p>
<pre><code class="language-cpp">int a = 10;
int *p;

*p = &amp;a; // geht nicht. Compiler meckert.
</code></pre>
<pre><code class="language-cpp">int a = 10;
int *p = &amp;a; // geht!
</code></pre>
<p>Wo ist bei diesen beiden Beispielen der Unterschied?</p>
<p>Gibt es ein einfaches Beispiel, an dem man mal nachvollziehen kann, was man mit Zeigern realisieren kann, nicht aber mit &quot;normalen&quot; Referenzen?</p>
<p>Viele Grüße<br />
Matthias Bo</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/193366/zeigerprobleme</link><generator>RSS for Node</generator><lastBuildDate>Mon, 28 Sep 2026 00:45:11 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/193366.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 25 Sep 2007 14:35:17 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Zeigerprobleme on Tue, 25 Sep 2007 14:35:17 GMT]]></title><description><![CDATA[<p>Hallo zusammen,<br />
ich versuche gerade mich etwas in c++ rein zu arbeiten aber , wie scheinbar ziemlich viele andere, hänge ich bei den Zeigern irgendwie fest. Ich verstehe einfach nicht den Sinn der Zeiger. Ich programmiere seit langer Zeit beruflich in PHP und bin auch in VB relativ fit. Was das Programmieren angeht bin ich also nicht gerade unerfahren. Ich benutze natürlich auch beispielsweise in PHP Referenzen und komme damit gut klar aber die Zeiger in c++ geben mir den Rest. Es liegt sicherlich zum Teil daran, dass ich einige Sachen dabei einfach nur unlogisch finde (wahrscheinlich weil ich nicht ganz dahintersteige).</p>
<p>Beispiel:</p>
<pre><code class="language-cpp">int a = 10;
int *p;

p = &amp;a;

cout &lt;&lt; *p; // gibt 10 aus
</code></pre>
<p>So weit, so gut.<br />
Jetzt kommt etwas, dass sich meiner Logik verschliesst:</p>
<pre><code class="language-cpp">int a = 10;
int *p;

*p = &amp;a; // geht nicht. Compiler meckert.
</code></pre>
<pre><code class="language-cpp">int a = 10;
int *p = &amp;a; // geht!
</code></pre>
<p>Wo ist bei diesen beiden Beispielen der Unterschied?</p>
<p>Gibt es ein einfaches Beispiel, an dem man mal nachvollziehen kann, was man mit Zeigern realisieren kann, nicht aber mit &quot;normalen&quot; Referenzen?</p>
<p>Viele Grüße<br />
Matthias Bo</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1372462</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1372462</guid><dc:creator><![CDATA[Matthias Bo]]></dc:creator><pubDate>Tue, 25 Sep 2007 14:35:17 GMT</pubDate></item><item><title><![CDATA[Reply to Zeigerprobleme on Tue, 25 Sep 2007 14:40:48 GMT]]></title><description><![CDATA[<p>Der zweite Code funktioniert nicht, weil du den Zeiger (unbeabsichtigt) dereferenziert hast -selbst wenn der Compiler das durchgehen lassen würde, wäre die Folge ein SegFault. Das dritte Beispielt stellt eine Definition (int*p) mit Initialisierung (=&amp;a) dar.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1372467</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1372467</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Tue, 25 Sep 2007 14:40:48 GMT</pubDate></item><item><title><![CDATA[Reply to Zeigerprobleme on Tue, 25 Sep 2007 14:57:50 GMT]]></title><description><![CDATA[<p>Matthias Bo schrieb:</p>
<blockquote>
<p>Jetzt kommt etwas, dass sich meiner Logik verschliesst:</p>
<pre><code class="language-cpp">int a = 10;
int *p;

*p = &amp;a; // geht nicht. Compiler meckert.
</code></pre>
<pre><code class="language-cpp">int a = 10;
int *p = &amp;a; // geht!
</code></pre>
<p>Wo ist bei diesen beiden Beispielen der Unterschied?</p>
</blockquote>
<p>Das eine ist ein Ausdruck (* ist hier ein Operator, der einen Zeiger als Operand hat), das andere eine Deklaration und Definition (* ist hier ein Deklarator, der den Grundtyp int dekoriert und den von int abgeleiteten Typ Zeiger-auf-int generiert).</p>
<pre><code class="language-cpp">int a = 10;
int *p; // Deklariert, dass p in allen folgenden Ausdrücken auf ein Zeigerobjekt auf int verweist

*p = &amp;a; // geht nicht. Compiler meckert.
         // Der Subausdruck p verweist auf ein Zeigerobjekt
         // Der unäre Operator * benutzt den Wert des Arguments (d.h. den Wert des Zeigerobjekts, auf das p verweist bzw. das p heißt) und liefert als Ergebnis einen Verweis (technisch: lvalue) auf das int-Objekt, auf das p zeigt)
         // der Subausdruck *p verweist also auf ein int (und hat damit den Typ int)
         // Der Subausdruck &amp;a ist dagegen ein Zeiger auf ein int
         // damit sind die Typen auf beiden Seiten der Zuweisung inkompatibel, der Ausdruck ill-formed
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1372469</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1372469</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Tue, 25 Sep 2007 14:57:50 GMT</pubDate></item><item><title><![CDATA[Reply to Zeigerprobleme on Tue, 25 Sep 2007 14:51:15 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">int a = 10; // Deklaration und Instanzierung einer Integervariable und Zuweisung eines Wertes an die Variable
int *p; // Deklaration eines Zeigers auf eine Integervariable
p = &amp;a; // Zuweisung der Adresse der Variable a an den Zeiger p
</code></pre>
<pre><code class="language-cpp">int a = 10; // s.o.
int *p; // s.o.
*p = &amp;a; // geht nicht, weil Du derefenzierst *)
</code></pre>
<p><em>) Durch das voranstellen eines * an eine Variable greifst Du nicht mehr auf den Zeiger zu, sondern auf den Wert, der an dieser Adresse gespeichert ist. Tückisch ist hierbei, dass es sich bei int *p um eine Deklaration und bei *p um eine Derefenzierung handelt. Ich vermute genau deswegen verwenden viele die Schreibweise int</em> p.</p>
<pre><code class="language-cpp">int a = 10;
int *p = &amp;a; // das ist das gleiche wie Zeile 2 und 3 aus Bespiel 1, nur in einer Zeile zusammengefaßt
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1372474</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1372474</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Tue, 25 Sep 2007 14:51:15 GMT</pubDate></item><item><title><![CDATA[Reply to Zeigerprobleme on Tue, 25 Sep 2007 18:24:58 GMT]]></title><description><![CDATA[<p>Ok, vielen Dank soweit. Das scheint mir jetzt einleuchtend zu sein. Aber bis ich hinter die ganzen &quot;Zeigergeschichten&quot; gestiegen bin, wird wohl noch einiges an Zeit verstreichen. Der Sinn der Grundgedankens &quot;Zeiger&quot; ist mir dennoch etwas rätselhaft.</p>
<p>Wahrscheinlich muss man selbst irgendwann erst an einen Punkt im Code kommen, an dem es ohne Zeiger nicht geht, um wirklich zu verstehen, wozu die Dinger gut sind :).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1372600</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1372600</guid><dc:creator><![CDATA[Matthias Bo]]></dc:creator><pubDate>Tue, 25 Sep 2007 18:24:58 GMT</pubDate></item><item><title><![CDATA[Reply to Zeigerprobleme on Tue, 25 Sep 2007 19:00:24 GMT]]></title><description><![CDATA[<p>Ich kann dir direkt ein Beispiel nennen bei denen du ohne Zeiger (oder auch Referenzen) nicht auskommen würdest.</p>
<p>Nehmen wir an du wolltest die Werte zweier Variablen in einer Tausch-Funktion tauschen lassen:</p>
<pre><code class="language-cpp">//Übergabe als Zeiger
#include &lt;iostream&gt;
#include &lt;conio.h&gt; // Für den lieben Borland
using namespace std;

//--

void Tauschen(int *x,int *y); //Prototyp der Funktion, nimmt die Werte der Variable entgegen, auf die die Zeiger gerichtet sind

int main()
{
  int X = 5,Y = 10;
  cout &lt;&lt; &quot;Vor dem Tauschen: X = &quot; &lt;&lt; X &lt;&lt; &quot; , Y = &quot; &lt;&lt; Y &lt;&lt; endl;  
  Tauschen(&amp;X,&amp;Y);//Übergabe der Adresse an die Funktion
  cout &lt;&lt; &quot;Nach dem Tauschen: X = &quot; &lt;&lt; X &lt;&lt; &quot; , Y = &quot; &lt;&lt; Y &lt;&lt; endl;
  getch();//Damit das Fenster offen bleibt ( Borland ;&gt; )
}

void Tauschen(int *x,int *y)
{
  int TEMP;
  TEMP = *y;
  *y = *x;
  *x = TEMP;
}
</code></pre>
<p>Da nur die Werte der Variablen an die Funktionen übergeben werden, würde das ohne Zeiger nicht Funktionieren, da sonst nur innerhalb der Funktion Tauschen() die Werte der lokalen Variablen vertauscht würden.</p>
<p>Du kannst ja mal schauen was hierbei rauskommen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /> Gruß</p>
<pre><code class="language-cpp">//Übergabe als Zeiger
#include &lt;iostream&gt;
#include &lt;conio.h&gt; // Für den lieben Borland
using namespace std;

//--

void Tauschen(int X,int Y); //Prototyp der Funktion, nimmt die Werte der Variablen entgegen, auf die die Zeiger im Speicher zeigen

int main()
{
  int X = 5,Y = 10;
  cout &lt;&lt; &quot;Vor dem Tauschen: X = &quot; &lt;&lt; X &lt;&lt; &quot; , Y = &quot; &lt;&lt; Y &lt;&lt; endl;  
  Tauschen(X,Y);//Übergabe der Adresse an die Funktion
  cout &lt;&lt; &quot;Nach dem Tauschen: X = &quot; &lt;&lt; X &lt;&lt; &quot; , Y = &quot; &lt;&lt; Y &lt;&lt; endl;
  getch();//Damit das Fenster offen bleibt ( Borland ;&gt; )
}

void Tauschen(int X,int Y)
{
  int TEMP;
  TEMP = Y;
  Y = X;
  X = TEMP;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1372622</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1372622</guid><dc:creator><![CDATA[mulo]]></dc:creator><pubDate>Tue, 25 Sep 2007 19:00:24 GMT</pubDate></item><item><title><![CDATA[Reply to Zeigerprobleme on Tue, 25 Sep 2007 19:36:58 GMT]]></title><description><![CDATA[<p>Ok, das ist einleuchtend. Aber in PHP würde ich das nach diesem Prinzip machen:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
using namespace std;

void myswap(int &amp;a, int &amp;b){

	int tmp;
	tmp = a;
	a = b;
	b = tmp;
}

int main (){

	int a = 10;
	int b = 20;

	myswap(a, b);

	cout &lt;&lt; a &lt;&lt; &quot; &quot; &lt;&lt; b &lt;&lt; endl;

	return 0;
}
</code></pre>
<p>Ich würde also lediglich Referenzen benutzen und auf Zeiger verzichten. Genau aus diesem Grund sind mir die Zeiger ja so suspekt. Ich sehe einfach kein einleuchtendes Beispiel, bei dem ich unbedingt Zeiger brauche.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1372650</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1372650</guid><dc:creator><![CDATA[Matthias Bo]]></dc:creator><pubDate>Tue, 25 Sep 2007 19:36:58 GMT</pubDate></item><item><title><![CDATA[Reply to Zeigerprobleme on Tue, 25 Sep 2007 19:43:50 GMT]]></title><description><![CDATA[<p>Zeiger brauchst du generell für verkettete Datenstrukturen (Bäume, Listen usw.) sowie zur Verwaltung dynamisch angeforderten Speichers (new/delete).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1372655</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1372655</guid><dc:creator><![CDATA[Bashar]]></dc:creator><pubDate>Tue, 25 Sep 2007 19:43:50 GMT</pubDate></item><item><title><![CDATA[Reply to Zeigerprobleme on Tue, 25 Sep 2007 19:59:46 GMT]]></title><description><![CDATA[<p>Außerdem ist es praktisch, wenn wahlweise ein Objekt übergeben werden kann, etwa so:</p>
<pre><code class="language-cpp">int foo( int* a, int* b )
{
    int i = 5;
    if ( a != 0 ) // FALLS ein gültiger Zeiger auf einen int übergeben wurde
        i *= *a;  //   dann i mit dem Wert dahinter malnehmen
    if ( b != 0 )
        i *= b;
    return i;
}

..

//entweder
int a=7, b=9;
int c = foo( &amp;a, &amp;b ); // Ergebnis wäre 5*7*9

//oder
int a=8;
int c = foo( &amp;a, 0 ); // Ergebnis wäre 5*8

// oder
int a = 100;
int c = foo( 0, &amp;a ); // Ergebnis wäre 5*100
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1372671</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1372671</guid><dc:creator><![CDATA[Badestrand]]></dc:creator><pubDate>Tue, 25 Sep 2007 19:59:46 GMT</pubDate></item></channel></rss>