<?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[Pointer-Problem: Anfänger]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich verstehe nicht wie ich ein double array füllen soll das ich über Pointer an eine funktion übergebe. Ich versuche es im Moment so:</p>
<pre><code class="language-cpp">double *arr  = NULL;

my_function(&amp;arr);

...
void my_function(doubl** arr)
{
   //ich möchte z.B jetzt nur das dritte element setzen. dazu schalte ich 
   // den pointer fort:
   arr += 2;

   *arr = 7.9;

}

//muss ich denn das setzen so gestalten:?
*arr[2] = 7.9; 

//Wie kann ich denn einfach den pointer weiterschalten und dann ohne dass //ich eine indizierung habe den wert setzen?
</code></pre>
<p>Noch ein Frage:<br />
Wenn ich das array fülle und den pointer immer weiterschalte - ist denn der pointer nach der prozedur immer noch am ende des arrays? Also zeigt er immer noch an das ende des arrrays oder steht er wieder am anfang?</p>
<p>Danke</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/189405/pointer-problem-anfänger</link><generator>RSS for Node</generator><lastBuildDate>Fri, 25 Sep 2026 11:08:03 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/189405.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 12 Aug 2007 16:49:11 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Pointer-Problem: Anfänger on Sun, 12 Aug 2007 16:49:11 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich verstehe nicht wie ich ein double array füllen soll das ich über Pointer an eine funktion übergebe. Ich versuche es im Moment so:</p>
<pre><code class="language-cpp">double *arr  = NULL;

my_function(&amp;arr);

...
void my_function(doubl** arr)
{
   //ich möchte z.B jetzt nur das dritte element setzen. dazu schalte ich 
   // den pointer fort:
   arr += 2;

   *arr = 7.9;

}

//muss ich denn das setzen so gestalten:?
*arr[2] = 7.9; 

//Wie kann ich denn einfach den pointer weiterschalten und dann ohne dass //ich eine indizierung habe den wert setzen?
</code></pre>
<p>Noch ein Frage:<br />
Wenn ich das array fülle und den pointer immer weiterschalte - ist denn der pointer nach der prozedur immer noch am ende des arrays? Also zeigt er immer noch an das ende des arrrays oder steht er wieder am anfang?</p>
<p>Danke</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1343241</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1343241</guid><dc:creator><![CDATA[gast_xy]]></dc:creator><pubDate>Sun, 12 Aug 2007 16:49:11 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer-Problem: Anfänger on Sun, 12 Aug 2007 17:10:34 GMT]]></title><description><![CDATA[<p>Also einmal: Pointer bleiben da, wo du sie hinweist, die tun nix von sich aus.</p>
<p>Wenn du einen Pointer auf NULL setzt, dann verweist er auf kein Objekt, d.h. du darfst ihn nicht derefenzieren (=&gt; auf den Wert des Objekts auf das der Pointer zeigt zugreifen).<br />
Wenn du jetzt ein double Array erstellen willst, machst du das so:</p>
<pre><code class="language-cpp">double * arr = new double[10]; // legt ein double Array mit 10 Elementen an
</code></pre>
<p>wenn du arr nicht mehr brauchst, musst du den Speicher mit delete[]freigeben, da sonst ein Speicherleck entsteht ...</p>
<pre><code class="language-cpp">delete[] arr;
</code></pre>
<p>Deine Funktion my_function kannst du wie folgt einbauen:</p>
<pre><code class="language-cpp">void my_function(double * _arr) { 
// ein einacher Pointer reicht, du übergibst einfach arr und nicht &amp; arr an my_function, dann zeigen beide Pointer auf das gleiche objekt

  // Zugreifen auf das 3. Element kannst du nun wie folgt:
  _arr[2] = 7.9;
}

Aufrufen mittels:
my_function(arr); // Adresse von arr wird nach _arr kopiert
</code></pre>
<p>Willst du unbedingt die Pointer auf Pointer Sache mal ausprobieren:</p>
<pre><code class="language-cpp">void my_function(double ** _arr) { 
  (*_arr)[2] = 7.9;
}
Aufrufen mittels:
myfunction(&amp;arr); // _arr bekommt die Adresse von arr zugewiesen
</code></pre>
<p>Durch (*_arr) greifst du auf das Objekt auf das _arr verweist zu - da das Objekt, auf das _arr verweist, aber wieder eine Adresse ist, nimmst du den Indexoperator, um auf den Wert an der 3. Position zuzugreifen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1343249</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1343249</guid><dc:creator><![CDATA[Checker*amp*Murckser]]></dc:creator><pubDate>Sun, 12 Aug 2007 17:10:34 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer-Problem: Anfänger on Mon, 13 Aug 2007 12:23:46 GMT]]></title><description><![CDATA[<p>Danke für die Hile...</p>
<p>leider verstehe ich so etwas immer noch nicht:</p>
<p>nach my_function2() ist die länge nicht gesetzt wenn ich es so mache:</p>
<pre><code class="language-cpp">Matrix *M;

...

my_function(M);

Class::my_function(Matrix *M)
{
      my_function2(M);
}

Class::my_function2(Matrix *M)
 {
      M-&gt;setze_länge(4);
}
</code></pre>
<p>statt dessen funktioniert es so:</p>
<pre><code class="language-cpp">Matrix *M;

...

my_function(M);

Class::my_function(Matrix *M)
{
      my_function2(&amp;M);
}

Class::my_function2(Matrix **M)
{
      (*M)-&gt;setze_länge(4);
}
</code></pre>
<p>Kann mir das jemand erklären? warum funktioniert beispiel 1 nicht - da habe ich doch einen poiner auf die Matrix also müssste es doch klappen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1343673</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1343673</guid><dc:creator><![CDATA[gast_xy]]></dc:creator><pubDate>Mon, 13 Aug 2007 12:23:46 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer-Problem: Anfänger on Mon, 13 Aug 2007 12:44:43 GMT]]></title><description><![CDATA[<p>Hm, was meinst du mit &quot;funktioniert nicht&quot;?</p>
<p>Ob du den pointer auf die Matrix nun per Wert (Version a) oder per Referen/pointer surchreichst, sollte eigentlich keinen nennenswerten Unterschied machen, eventuell wirds sogar so weit wegoptimiert, dass das selbe bei rauskommt...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1343685</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1343685</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Mon, 13 Aug 2007 12:44:43 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer-Problem: Anfänger on Mon, 13 Aug 2007 16:25:31 GMT]]></title><description><![CDATA[<p>Bei beispiel 1 gibt es einen segmentation fault....bei beispiel 2 nicht.</p>
<p>Ich lege den pointer so an: Matrix* M = NULL;</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1343839</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1343839</guid><dc:creator><![CDATA[gast_xy]]></dc:creator><pubDate>Mon, 13 Aug 2007 16:25:31 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer-Problem: Anfänger on Mon, 13 Aug 2007 16:42:34 GMT]]></title><description><![CDATA[<p>also ich glaube das Problem liegt darin:</p>
<p>[cpp]<br />
Matrix *M;</p>
<p>...</p>
<p>my_function(M);</p>
<p>Class::my_function(Matrix *M)<br />
{<br />
M = my_function2(M);<br />
M-&gt;set_length(4);<br />
}</p>
<p>Matrix* Class::my_function2(Matrix *M)<br />
{<br />
<strong>M = New_Matrix();</strong><br />
return M;<br />
}<br />
[/cpp]</p>
<p>kann es sein dass durch die Methode New-Matrix() da irgendwas nicht passt - dort gebe ich einen Pointer zurück auf einen Heap-Bereich....</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1343849</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1343849</guid><dc:creator><![CDATA[gast_xy]]></dc:creator><pubDate>Mon, 13 Aug 2007 16:42:34 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer-Problem: Anfänger on Tue, 14 Aug 2007 10:12:07 GMT]]></title><description><![CDATA[<p>Ok also nochmals anders:</p>
<p>Es ist ein triviales Problem bei dem ich nicht mehr durchblicke.</p>
<pre><code class="language-cpp">Matrix * a = NULL;

//pointer a wird initialisiert und zeigt auf etwas

my_function(a);
//auf len zugreifen löst segfault aus
std::cout &lt;&lt; a-&gt;lines-&gt;len &lt;&lt; std::endl;

//....
void Class::my_function(Matrix *a)
{
    my_function2(a);
}

//...
void Class::my_function2(Matrix *a)
{
      //Hier mache ich was mim pointer also greife
    //z.B auf Daten zu und verändere:
    a-&gt;lines-&gt;len = 4;
}
</code></pre>
<p>also irgendwas ist da falsch weil ich kann in der ausgangsfunktion als da wo my_function() aufgerufen wird nicht ohne einen seg-fault auf len zugreifen.</p>
<p>Wenn ich statt dieser variante folgendes mache gehts - ist das so üblich wie ich es mache folgt?:</p>
<pre><code class="language-cpp">Matrix * a = NULL;

//pointer a wird initialisiert und zeigt auf etwas

my_function(a);
//auf len zugreifen geht
std::cout &lt;&lt; a-&gt;lines-&gt;len &lt;&lt; std::endl;

//....
void Class::my_function(Matrix *&amp;a)
{
    my_function2(a);
}

//...
void Class::my_function2(Matrix *&amp;a)
{
      //Hier mache ich was mim pointer also greife
    //z.B auf Daten zu und verändere:
    a-&gt;lines-&gt;len = 4;
}
</code></pre>
<p>oder ist das hier besser?</p>
<pre><code class="language-cpp">Matrix * a = NULL;

//pointer a wird initialisiert und zeigt auf etwas

my_function(&amp;a);
//auf len zugreifen geht
std::cout &lt;&lt; a-&gt;lines-&gt;len &lt;&lt; std::endl;

//....
void Class::my_function(Matrix **a)
{
    my_function2(&amp;a);
}

//...
void Class::my_function2(Matrix **a)
{
      //Hier mache ich was mim pointer also greife
    //z.B auf Daten zu und verändere:
    (*a)-&gt;lines-&gt;len = 4;
}
</code></pre>
<p>danke für eure Hilfe</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1344168</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1344168</guid><dc:creator><![CDATA[gast_xy]]></dc:creator><pubDate>Tue, 14 Aug 2007 10:12:07 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer-Problem: Anfänger on Tue, 14 Aug 2007 10:19:15 GMT]]></title><description><![CDATA[<p>Erstens: Ich hoffe doch, vor dem Zugriff (in der my_function2()) hast du etwas Speicher hinter dem Pointer angelegt, sonst gäbe es dort auch einen SegFault.</p>
<p>Zweitens: Bei Variante 1 übergibst du eine Kopie des Zeigers, d.h. das globale 'a' bekommt gar nicht mit, wenn du in deinen Funktionen etwas zuweist. Bei Variante 2 und 3 (2 ist C++'iger ;)) übergibst du eine Referenz bzw. Zeiger auf dein globales 'a' und alle Aktionen wirken direkt durch.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1344172</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1344172</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Tue, 14 Aug 2007 10:19:15 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer-Problem: Anfänger on Thu, 16 Aug 2007 12:46:15 GMT]]></title><description><![CDATA[<p>Ich bin zwar selbst erst Anfänger in Sachen C++ aber ich werde das Gefühl nicht los, dass Du (Original-Poster) der Annahme unterliegst, ein Pointer (Zeiger) ist gleich dem Objekt, auf den er zeigen soll.</p>
<p>int a = 12; &lt;-- a ist eben ein int-Objekt mit dem Wert 12</p>
<p>int *b = 12; &lt;-- wäre ein Zeiger auf ein int-Objekt, welches (im Speicher) bei der Adresse 12 liegt.</p>
<p>Die Dereferenzierung von Zeiger b: *b gibt dir also nicht 12, sondern den Wert der bei Adresse 12 liegt -&gt; also was vollkommen undefiniertes.</p>
<p>int *b = &amp;a; &lt;-- &amp; ermittelt die Adresse (im Speicher) von a und diese wird dann b zugewiesen. Zu zeigt b nun auf a (im Speicher). Die Dereferenzierung *b gibt nun das gewünschte Ergebnis: 12.<br />
und haben für sich alleine soviel Aussagekraft wie<br />
Was für int-Objekte gilt, gilt für alle anderen auch.</p>
<p>Pointer/Zeiger sind eigenständige Objekte/Variablen.</p>
<p>Ich hoffe ich konnte ein bisschen aufklären. Korrigiert mich bitte, wenn ich falsch liege. <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="😉"
    /></p>
<p>Regards...</p>
<p>Heiko</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1345734</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1345734</guid><dc:creator><![CDATA[bwbg]]></dc:creator><pubDate>Thu, 16 Aug 2007 12:46:15 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer-Problem: Anfänger on Thu, 16 Aug 2007 13:08:10 GMT]]></title><description><![CDATA[<blockquote>
<p>int *b = 12; &lt;-- wäre ein Zeiger auf ein int-Objekt, welches (im Speicher) bei der Adresse 12 liegt.</p>
</blockquote>
<p>du kannst doch keinen int einem int* zuweisen.....</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1345758</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1345758</guid><dc:creator><![CDATA[gast_xy]]></dc:creator><pubDate>Thu, 16 Aug 2007 13:08:10 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer-Problem: Anfänger on Thu, 16 Aug 2007 13:29:33 GMT]]></title><description><![CDATA[<p>int* 's sind intergale Werte, die dann implizit koncvertiert werden, wenn du sie einem int zuweist oder umgekehrt. geratenerweise wuerde die Ardesse (der Wert des pointers) nach obigem Ausdruck etwa so aussehen:</p>
<p>0x0C000000 oder 0x0000000C (0x0C = hexadezimal 12)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1345784</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1345784</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Thu, 16 Aug 2007 13:29:33 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer-Problem: Anfänger on Thu, 16 Aug 2007 13:39:09 GMT]]></title><description><![CDATA[<p>pumuckl schrieb:</p>
<blockquote>
<p>int* 's sind intergale Werte, die dann implizit koncvertiert werden, wenn du sie einem int zuweist oder umgekehrt.</p>
</blockquote>
<p>In C++ werden Typen unterschiedlicher Indirektionsebenen nicht implizit konvertiert. In C++ werden nichtmal unterschiedliche Typen gleicher Indirektionsebene konvertiert (ausser die Konvertierung ist trivial, Bsp. short nach int). Nichtmal void* wird implizit in einen anderen Zeigertyp umgewandelt. Zum Glück.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1345794</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1345794</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Thu, 16 Aug 2007 13:39:09 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer-Problem: Anfänger on Thu, 16 Aug 2007 14:48:49 GMT]]></title><description><![CDATA[<p>Du hast vollkommen recht. Es funktioniert lediglich</p>
<p>int a* = 0; // NULL ist z.B. in iostream mit 0 definiert</p>
<p>Ersetze 12 im Bezug auf den Pointer durch 0 <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="😉"
    /></p>
<p>Das ändert jetzt aber auch nichts an der Kernaussage. Ein einsamer Pointer (z.B. Matrix * a = NULL) hat soviel Sinn wie ein Kubikmeter Luft bei 20°C. Wie die Poster vor mir schon bemerkten, kannst du den Pointer erst verwenden, wenn du ein konkretes Objekt hast, dessen Adresse du (bzw. der Pointer) kennst:</p>
<p>Matrix mymatrix;<br />
Matrix* myptr_to_mymatrix = &amp;mymatrix;</p>
<p>oder</p>
<p>Matrix* myptr_to_a_matrix = new Matrix; // &lt;-- hier aber nicht das delete.. vergessen.</p>
<p>nicht sinnvoll ist</p>
<p>Matrix* myptr_to_a_matrix = NULL;</p>
<p>wenn du kein konkretes Matrix-Objekt anlegst. Beim Aufruf von *myptr_to_a_matrix würde dein Programm versuchen auf ein Matrix-Objekt zuzugreifen, welches sich ab Adresse 0 im Speicher befindet (und da ist mit Sicherheit keins!).</p>
<p>Grüße aus dem Sauerland...</p>
<p>Heiko</p>
<p>EDIT:</p>
<p>Dein Anfangsproblem habe ich ganz aus den Augen verloren. Ich habe kurzerhand ein Beispielprogramm erstellt, welches (hoffentlich) annähernd deinem Problemfall entspricht.</p>
<pre><code>[cpp]#include &lt;iostream&gt;

void fill_array(float* array, int array_length);
void display_array(float* array, int array_length);

int main(int argc, char** args)
	{
		const int arr_length = 20;
		float array[arr_length];

		fill_array(array, arr_length);
		display_array(array, arr_length);

		return 0;
	}

void fill_array(float* array, int array_length)
	{
		// Array mit 13.5 + i auffüllen
		for(int i = 0; i &lt; array_length; i++) {
			array[i] = 13.5 + static_cast&lt;float&gt;(i);
		}
	}

void display_array(float* array, int array_length)
	{
		// Array ausgeben
		for(int i = 0; i &lt; array_length; i++) {
			std::cout &lt;&lt; array[i] &lt;&lt; &quot; &quot;;
		}
		std::cout &lt;&lt; std::endl;
	}	
[/cpp]
</code></pre>
<p>Kritik erwünscht.</p>
<p>Grüße...</p>
<p>Heiko</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1345803</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1345803</guid><dc:creator><![CDATA[bwbg]]></dc:creator><pubDate>Thu, 16 Aug 2007 14:48:49 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer-Problem: Anfänger on Thu, 16 Aug 2007 14:40:52 GMT]]></title><description><![CDATA[<p>hm. wieder was gelernt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1345835</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1345835</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Thu, 16 Aug 2007 14:40:52 GMT</pubDate></item></channel></rss>