<?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 to Pointer als konstanter Rückgabewert]]></title><description><![CDATA[<p>Warum kompiliert die zweite Funktion hier nicht?</p>
<pre><code class="language-cpp">class Test
{
	int *m_Pointer;
	int **m_P2P;

	const int *GetPointer() const { return m_Pointer; }
		// Funktioniert

	const int **GetP2P() const { return m_P2P; }
		// Funktioniert nicht
};
</code></pre>
<p>Er sagt dann</p>
<blockquote>
<p>error: invalid conversion from 'int**' to 'const int**'</p>
</blockquote>
<p>Was muss ich hier ändern?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/288193/pointer-to-pointer-als-konstanter-rückgabewert</link><generator>RSS for Node</generator><lastBuildDate>Thu, 20 Aug 2026 03:10:58 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/288193.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 12 Jun 2011 11:36:57 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Pointer to Pointer als konstanter Rückgabewert on Sun, 12 Jun 2011 11:36:57 GMT]]></title><description><![CDATA[<p>Warum kompiliert die zweite Funktion hier nicht?</p>
<pre><code class="language-cpp">class Test
{
	int *m_Pointer;
	int **m_P2P;

	const int *GetPointer() const { return m_Pointer; }
		// Funktioniert

	const int **GetP2P() const { return m_P2P; }
		// Funktioniert nicht
};
</code></pre>
<p>Er sagt dann</p>
<blockquote>
<p>error: invalid conversion from 'int**' to 'const int**'</p>
</blockquote>
<p>Was muss ich hier ändern?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2077016</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2077016</guid><dc:creator><![CDATA[J-Dog]]></dc:creator><pubDate>Sun, 12 Jun 2011 11:36:57 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer to Pointer als konstanter Rückgabewert on Sun, 12 Jun 2011 11:47:59 GMT]]></title><description><![CDATA[<p>Hallo Jens,</p>
<p>meinst du vielleicht eigentlich</p>
<pre><code class="language-cpp">int * const *GetP2P() const { return m_P2P; }
</code></pre>
<p>an Stelle von</p>
<pre><code class="language-cpp">const int **GetP2P() const { return m_P2P; }
</code></pre>
<p>? <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>Also was soll bei deinem Konstrukt konstant sein?</p>
<p>Gruß<br />
Dobi</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2077022</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2077022</guid><dc:creator><![CDATA[Dobi]]></dc:creator><pubDate>Sun, 12 Jun 2011 11:47:59 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer to Pointer als konstanter Rückgabewert on Sun, 12 Jun 2011 12:05:11 GMT]]></title><description><![CDATA[<p>Bei meinem Code soll der Wert, der hinter dem Zeiger liegt, konstant sein, während die Adresse, auf die der Zeiger verweist, nicht konstant sein muss.</p>
<p>Das heißt, bei:</p>
<pre><code class="language-cpp">p = test.GetP2P();
</code></pre>
<p>soll das hier möglich sein:</p>
<pre><code class="language-cpp">p = NULL;
p = new ...;
</code></pre>
<p>Aber das hier soll nicht möglich sein:</p>
<pre><code class="language-cpp">**p = 23;
*p = NULL
</code></pre>
<p>Das heißt, die lokale Variable, die den Zeiger hält, soll veränderbar sein (Wieso auch nicht? Es ist ja nur die lokale Vraible, die auf nichts Außenstehendes Einfluss hat.), aber alles, was tatsächlich den Zustand in der Klasse ändert, soll nicht möglich sein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2077032</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2077032</guid><dc:creator><![CDATA[J-Dog]]></dc:creator><pubDate>Sun, 12 Jun 2011 12:05:11 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer to Pointer als konstanter Rückgabewert on Sun, 12 Jun 2011 12:16:58 GMT]]></title><description><![CDATA[<p>Falls du mit</p>
<pre><code class="language-cpp">p = new ...;
</code></pre>
<p>sowas wie</p>
<pre><code class="language-cpp">p = new int( 2 );
</code></pre>
<p>meintest, wird das nicht gehn.<br />
Dafür müsste p ein int* und kein int** sein.<br />
Ansonsten hörts sich für mich so an als, als wolltest du</p>
<pre><code class="language-cpp">const int * const *
</code></pre>
<p>Mit den Testzeilen siehts dann so aus:</p>
<pre><code class="language-cpp">class Test
{
public:
    const int *GetPointer() const { return m_Pointer; }
    const int * const * GetP2P() const { return m_P2P; }
private:
    int *m_Pointer;
    int **m_P2P;
};

int main()
{
	Test test;
	const int * const *p = test.GetP2P();
	p = 0;
	**p = 23; // error: assignment of read-only location '*(const int*)(* p)'
	*p = 0; // error: assignment of read-only location '* p'
	return 0;
}
</code></pre>
<p>Vielleicht sollte man den lustigen Zeigertyp da noch typedeffen.</p>
<p>Ist das eigentlich nur ne Übung zu Zeigern und zum const-Verständnis, oder hast du vor wirklich sowas verwirrendes zu machen? <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>
]]></description><link>https://www.c-plusplus.net/forum/post/2077038</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2077038</guid><dc:creator><![CDATA[Dobi]]></dc:creator><pubDate>Sun, 12 Jun 2011 12:16:58 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer to Pointer als konstanter Rückgabewert on Sun, 12 Jun 2011 12:33:02 GMT]]></title><description><![CDATA[<p>Das hat tatsächlich praktische Relevanz. Die Zeiger stellen nämlich eigentlich Arrays dar bzw. ein Array auf Arrays. (Und ja, ich weiß, dass es dafür bereits den std::vector-Datentyp gibt, aber in meinem konkreten Fall ist es ein DOS-Programm unter Turbo C++.) Wobei die inneren Arrays jeweils unterschiedlich lang sein können, es ist also kein simples zweidimensionales Array, sondern mehr sowas:</p>
<pre><code>Array von Array von char (3 Einträge)
|
+--Array von char (5 Einträge)
|  |
|  +-- 'A', 'X', 'G', 'F', 'T'
|
+--Array von char (2 Einträge)
|  |
|  +-- 'K', 'W'
|
+--Array von char (4 Einträge)
   |
   +-- 'M', 'Z', 'Z', 'V'
</code></pre>
<p>Und hier soll es eben so sein, dass wenn man sich in der main mit GetP2P() den Zeiger auf den Zeiger holt, man nicht in der Lage sein soll, irgendwas in der Klasse zu ändern. Das heißt, man soll nicht das 'K' in ein 'U' umwandeln dürfen, man soll auch nicht das zweite innere Array auf NULL setzen dürfen. Und man darf natürlich auch nicht das äußere Array auf NULL setzen. Was man aber machen kann: Man darf seinen lokalen Zeiger auf NULL setzen, denn das würde ja den Inhalt der Klasse nicht beeinflussen.</p>
<p>Unter diesen Voraussetzungen: Ist <code>const T * const *</code> die richtige Wahl?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2077046</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2077046</guid><dc:creator><![CDATA[J-Dog]]></dc:creator><pubDate>Sun, 12 Jun 2011 12:33:02 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer to Pointer als konstanter Rückgabewert on Sun, 12 Jun 2011 12:38:26 GMT]]></title><description><![CDATA[<p>Japp.<br />
Gar keine Zeiger rausgeben und sattdessen Funktionen zum Elementzugriff anbieten geht nicht?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2077050</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2077050</guid><dc:creator><![CDATA[Dobi]]></dc:creator><pubDate>Sun, 12 Jun 2011 12:38:26 GMT</pubDate></item></channel></rss>