<?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[Durch Pointer verwirrt... (Wie gehts richtig?)]]></title><description><![CDATA[<p>Hallo zusammen ...</p>
<p>Durch Pointer kann man ja die Speicheradressen an Funktionen übergeben und so dafür sorgen, dass der Inhalt einer Variable, wenn er in der Funktion geändert ist auch im Hauptprogramm geändert ist.</p>
<p>So zum Beispiel:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

void Test(char *text)
{
	int i;
	for (i=0;i&lt;5;i++) text[i]='u';	
}

int main()
{
	char text[128]=&quot;Test&quot;;

	printf(&quot;%s\n&quot;,text);
	Test(text);
	printf(&quot;%s&quot;,text);

	return 0;
}
</code></pre>
<p>Ich habe also in Main ein Array, dessen Adresse übergebe ich in Test. Dort wird der Inhalt der Speicheradressen verändert, sodass ich die aktuellen Werte in Main wieder abrufen kann.<br />
Soweit so klar!</p>
<p>Jetzt wollte ich das Ganze aber gern umgedreht <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
<p>Also in Test ein Array auf welches ich in Main gern zurück greifen würde. Wird irgendetwas am Array in Test geändert, soll man es auch gleich in Main merken.<br />
Meine Idee, war also eventuell die Adresse des 0ten Arrayfeldes von der Test-Funktion zurück geben zu lassen und dann in Main den Pointer diese Adresse zuweisen zu lassen.<br />
Also so:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

char Test()
{
	int i;
	char Zeile[20]=&quot;Da........&quot;;
	return &amp;Zeile[0];
}

int main()
{
	char text[128]=&quot;Test&quot;;

	printf(&quot;%s\n&quot;,text);
	&amp;text[0]=Test();
	printf(&quot;%s\n&quot;,text);

	return 0;
}
</code></pre>
<p>Das klappt aber nicht. Ich erhalte den Fehler: &quot;error C2440: '=': 'char' kann nicht in 'char *' konvertiert werden&quot;.</p>
<p>Wo liegt mein Denkfehler? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /><br />
Und vor allem: Wie bekomm ichs hin?</p>
<p>Danke für euere Hilfe! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/topic/240981/durch-pointer-verwirrt-wie-gehts-richtig</link><generator>RSS for Node</generator><lastBuildDate>Mon, 21 Sep 2026 17:44:48 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/240981.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 14 May 2009 09:18:52 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Durch Pointer verwirrt... (Wie gehts richtig?) on Thu, 14 May 2009 09:18:52 GMT]]></title><description><![CDATA[<p>Hallo zusammen ...</p>
<p>Durch Pointer kann man ja die Speicheradressen an Funktionen übergeben und so dafür sorgen, dass der Inhalt einer Variable, wenn er in der Funktion geändert ist auch im Hauptprogramm geändert ist.</p>
<p>So zum Beispiel:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

void Test(char *text)
{
	int i;
	for (i=0;i&lt;5;i++) text[i]='u';	
}

int main()
{
	char text[128]=&quot;Test&quot;;

	printf(&quot;%s\n&quot;,text);
	Test(text);
	printf(&quot;%s&quot;,text);

	return 0;
}
</code></pre>
<p>Ich habe also in Main ein Array, dessen Adresse übergebe ich in Test. Dort wird der Inhalt der Speicheradressen verändert, sodass ich die aktuellen Werte in Main wieder abrufen kann.<br />
Soweit so klar!</p>
<p>Jetzt wollte ich das Ganze aber gern umgedreht <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
<p>Also in Test ein Array auf welches ich in Main gern zurück greifen würde. Wird irgendetwas am Array in Test geändert, soll man es auch gleich in Main merken.<br />
Meine Idee, war also eventuell die Adresse des 0ten Arrayfeldes von der Test-Funktion zurück geben zu lassen und dann in Main den Pointer diese Adresse zuweisen zu lassen.<br />
Also so:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

char Test()
{
	int i;
	char Zeile[20]=&quot;Da........&quot;;
	return &amp;Zeile[0];
}

int main()
{
	char text[128]=&quot;Test&quot;;

	printf(&quot;%s\n&quot;,text);
	&amp;text[0]=Test();
	printf(&quot;%s\n&quot;,text);

	return 0;
}
</code></pre>
<p>Das klappt aber nicht. Ich erhalte den Fehler: &quot;error C2440: '=': 'char' kann nicht in 'char *' konvertiert werden&quot;.</p>
<p>Wo liegt mein Denkfehler? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /><br />
Und vor allem: Wie bekomm ichs hin?</p>
<p>Danke für euere Hilfe! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1710324</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1710324</guid><dc:creator><![CDATA[Mandel]]></dc:creator><pubDate>Thu, 14 May 2009 09:18:52 GMT</pubDate></item><item><title><![CDATA[Reply to Durch Pointer verwirrt... (Wie gehts richtig?) on Thu, 14 May 2009 09:20:48 GMT]]></title><description><![CDATA[<p>Das ist kein C++, willst du es mit C++ oder C machen? Wenn C, dann falsches Forum, aber dann wirst du sicherlich verschoben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1710327</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1710327</guid><dc:creator><![CDATA[Firefighter]]></dc:creator><pubDate>Thu, 14 May 2009 09:20:48 GMT</pubDate></item><item><title><![CDATA[Reply to Durch Pointer verwirrt... (Wie gehts richtig?) on Thu, 14 May 2009 10:16:54 GMT]]></title><description><![CDATA[<p>Ganz wichtig: Man gibt keinen Pointer auf eine lokale Variable zurück, da ja die lokale Variable nach verlassen des Prozedur gelöscht wird --&gt; undefiniertes Verhalten.</p>
<p>Dein Rückgabewert der Funktion ist ein Pointer, schau mal deinen Methodenkopf an was du als Rückgabewert angegeben hast...</p>
<pre><code class="language-cpp">#include &lt;stdio.h&gt;

char* test() {
  static char* x = &quot;Das ist ein Test&quot;;
  // static: x ist auch nach verlassen der Prozedur noch vorhanden --&gt; kein    undefiniertes Verhalten
  return x;
}

int main() {
  char* text = &quot;Huhu&quot;;

  while(*text) {
    printf(&quot;%c&quot;, *text++);
  }
  printf(&quot;\n&quot;);

  text = test();

  while(*text) {
    printf(&quot;%c&quot;, *text++);
  }
  printf(&quot;\n&quot;);

  free(test);
  test = NULL;
  return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1710364</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1710364</guid><dc:creator><![CDATA[Ravendark]]></dc:creator><pubDate>Thu, 14 May 2009 10:16:54 GMT</pubDate></item><item><title><![CDATA[Reply to Durch Pointer verwirrt... (Wie gehts richtig?) on Thu, 14 May 2009 10:37:06 GMT]]></title><description><![CDATA[<p>Ein bischen Korrektur...</p>
<p>Ravendark schrieb:</p>
<blockquote>
<p>[...]</p>
<pre><code class="language-cpp">#include &lt;stdio.h&gt;

char* test() {
  static char* x = &quot;Das ist ein Test&quot;;
  // static: x ist auch nach verlassen der Prozedur noch vorhanden --&gt; kein    undefiniertes Verhalten
  return x;
}

int main() {
  char* text = &quot;Huhu&quot;;
  
  /*
  while(*text) {
    printf(&quot;%c&quot;, *text++);
  }
  printf(&quot;\n&quot;);
  */
  printf(&quot;%s\n&quot;, text);
  
  text = test();
  
  /*
  while(*text) {
    printf(&quot;%c&quot;, *text++);
  }
  printf(&quot;\n&quot;);
  */
  printf(&quot;%s\n&quot;, text);

  /*
  Autsch!
  free(test);
  test = NULL;
  */
  return 0;
}
</code></pre>
</blockquote>
<p>Oder mit C++</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;string&gt;

std::string Test()
{
    return &quot;Hallo Du da!&quot;;
}

int main()
{
    std::string text = &quot;Alter Text.&quot;;

    std::cout &lt;&lt; text &lt;&lt; '\n';
    text = Test();
    std::cout &lt;&lt; text &lt;&lt; '\n';

    return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1710376</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1710376</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Thu, 14 May 2009 10:37:06 GMT</pubDate></item><item><title><![CDATA[Reply to Durch Pointer verwirrt... (Wie gehts richtig?) on Thu, 14 May 2009 16:03:40 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/4465">@Tachyon</a><br />
und nun schreiben wir hundert mal an die Tafel: Globale variablen sind Boese (besonders wenn man sie ned wirklich notwendig sind).<br />
Das gilt auch fuer die gut versteckten ! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/20117">@Mandel</a><br />
den richtigen C++ weg hat dir Tachyon in seinem 2.Beispiel schon gezeigt, mit contaeinern, tiefen kopien und tiefen vertrauen in die optimierungsfaehigkeiten unseres compilers.</p>
<p>Bei C gibts keinen so nen Weg. In c wird normal nie in zeiger auf einen &quot;selbsterzeugten&quot; Speicherbereich zurueckgegeben.<br />
Aufn stack gibts nen Error, weil der Stack beim verlassen eh zurueckrollt und der zeiger ins Nirvana zeigen wuerd, und dynamischer Speicher, da wuerdest gegen eine Programmier Regel verstossen, die Lautet: Erzeuge dynamsichen Speicher im selben context (also COde Block oder Konstruktor/destructor ).<br />
Du wuerdest nen sehr fehelerannfaelliges Interface bekommen (weil dein user den speicher irgendwo expliziet wieder freigeben muss, wahrscheinlich mit ner von dir definierten funktion) und ausserdem wuerdest die art das speichers von vornherein festlegen.<br />
Ausserdem braucht man unter C meist soweiso nen Fehlercode, da C keine exceptions kennt.</p>
<p>besser man laesst die funktion in dem vom aufrufer spezifizierten speicher schreiben, dann hat er zwar mehr arbeit, aber auch die groessere flexibilitaet.<br />
Weisst du vornherein nicht, wie gross dein benoetigter speicher ist, dann gib der funktion nen Mode, wo sie den expliziet uebermitteln kann.</p>
<pre><code class="language-cpp">int Test(char *buffer,size_t * buffersize)
{
    int ireturn = ERROR_INVALIDBUFFERSIZEVARIABLE;
    if(buffersize)
    {
        if(buffer)
        {
            for(i=0;i&lt;min(5,*buffersize);i++)
            {
                buffer[i]='u';
            }
            ireturn = *buffersize &lt; 5 : ERROR_BUFFERTOSMALL : SUCCESS;
        }
        else
        {
            /// buffer = NULL, der usser will die grosse wissen 
            *buffersize = 5;
            ireturn = SUCCESS;
        }
    }
}
</code></pre>
<p>Verwenden koennte man das dann so:</p>
<pre><code class="language-cpp">/// statisch: 
   char buffer[128];
   memset(buffer,0,128);
   size_t size = 128; 
   if(Test(buffer,&amp;size) == SUCCESS)
   {
        std::cout &lt;&lt; buffer; 
   }
   else
   {
       // fehlerbehandlung, wenn der buffer ned grossgenug war
   }

   /// und dynamisch: 
   char * dynBuffer = NULL; 
   size_t size = 0; 
   if(test(dynBuffer ,&amp;size) == SUCCESS)
   {
       if(size &gt; 0)
       {
           /// dynamisch den buffer erzeugen 
           dynbuffer = (char *)malloc(size +1); // um 1 groesser fuer zeichenendezeichen 
           memset(dynbuffer,0,size + 1);
           if(test(dynBuffer ,&amp;size) == SUCCESS) 
           {
               /// Ausgabe
               std::cout &lt;&lt; dynBuffer; 
           }
           else
           {
                /// Fehlerbehandlung 
           }
       }
   }
</code></pre>
<p>Das waer sauberes C</p>
<p>Ciao ...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1710573</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1710573</guid><dc:creator><![CDATA[RHBaum]]></dc:creator><pubDate>Thu, 14 May 2009 16:03:40 GMT</pubDate></item></channel></rss>