<?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[Konstante Zeiger als Parameter]]></title><description><![CDATA[<p>Es gibt ja zwei Möglichkeiten, Zeigerparameter (und auch Zeiger im allgemeinen, aber mir geht es im Moment primär um die Parameter) konstant zu machen.</p>
<p>Möglichkeit 1:</p>
<pre><code class="language-cpp">const int *p
</code></pre>
<p>Hierbei kann zwar die Adresse, auf die der Zeiger zeigt, geändert werden, aber nicht der Wert dieser Adresse.</p>
<p>Möglichkeit 2:</p>
<pre><code class="language-cpp">int * const p
</code></pre>
<p>Diesmal kann man zwar den Wert, auf den referenziert wird, ändern, aber den Zeiger nicht auf eine andere Adresse &quot;umbiegen&quot;.</p>
<p>Nun meine Frage: Wenn ich einen vordefinierten Typ:</p>
<pre><code class="language-cpp">typedef int * PINT
</code></pre>
<p>und in einer Funktion den Parameter</p>
<pre><code class="language-cpp">const PINT p
</code></pre>
<p>habe, dann wird das automatisch als Möglichkeit 2 erkannt. Da das aber in den meisten Fällen nicht wünschenswert ist, würde ich gern wissen, wie ich das in so einem Fall schreiben muß, damit es sich um Möglichkeit 1 handelt.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/151077/konstante-zeiger-als-parameter</link><generator>RSS for Node</generator><lastBuildDate>Sun, 06 Sep 2026 01:28:41 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/151077.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 22 Jun 2006 20:21:39 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Konstante Zeiger als Parameter on Thu, 22 Jun 2006 20:21:39 GMT]]></title><description><![CDATA[<p>Es gibt ja zwei Möglichkeiten, Zeigerparameter (und auch Zeiger im allgemeinen, aber mir geht es im Moment primär um die Parameter) konstant zu machen.</p>
<p>Möglichkeit 1:</p>
<pre><code class="language-cpp">const int *p
</code></pre>
<p>Hierbei kann zwar die Adresse, auf die der Zeiger zeigt, geändert werden, aber nicht der Wert dieser Adresse.</p>
<p>Möglichkeit 2:</p>
<pre><code class="language-cpp">int * const p
</code></pre>
<p>Diesmal kann man zwar den Wert, auf den referenziert wird, ändern, aber den Zeiger nicht auf eine andere Adresse &quot;umbiegen&quot;.</p>
<p>Nun meine Frage: Wenn ich einen vordefinierten Typ:</p>
<pre><code class="language-cpp">typedef int * PINT
</code></pre>
<p>und in einer Funktion den Parameter</p>
<pre><code class="language-cpp">const PINT p
</code></pre>
<p>habe, dann wird das automatisch als Möglichkeit 2 erkannt. Da das aber in den meisten Fällen nicht wünschenswert ist, würde ich gern wissen, wie ich das in so einem Fall schreiben muß, damit es sich um Möglichkeit 1 handelt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1083388</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1083388</guid><dc:creator><![CDATA[NES-Spieler]]></dc:creator><pubDate>Thu, 22 Jun 2006 20:21:39 GMT</pubDate></item><item><title><![CDATA[Reply to Konstante Zeiger als Parameter on Thu, 22 Jun 2006 20:25:48 GMT]]></title><description><![CDATA[<p>neues typedef fuer CONST_PINT oder so anlegen...</p>
<p>sonst geht nix.</p>
<p>denn PINT ist n typ und const PINT ist ein konstanter typ und ein konstanter zeiger ist halt ein zeiger den du nicht veraendern kannst (den pointee (als das worauf gezeigt wird) hat mit dem zeiger ansich ja nix zu tun).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1083389</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1083389</guid><dc:creator><![CDATA[Shade Of Mine]]></dc:creator><pubDate>Thu, 22 Jun 2006 20:25:48 GMT</pubDate></item><item><title><![CDATA[Reply to Konstante Zeiger als Parameter on Thu, 22 Jun 2006 20:37:56 GMT]]></title><description><![CDATA[<p>Leider funktioniert weder</p>
<pre><code class="language-cpp">typedef const PINT PCTINT;
</code></pre>
<p>noch</p>
<pre><code class="language-cpp">typedef PINT const PCTINT;
</code></pre>
<p>Wenn der Parameter dann</p>
<pre><code class="language-cpp">PCTINT p
</code></pre>
<p>ist, tritt das gleiche Verhalten auf.<br />
Mein konkretes Problem ist übrigens, wer es wissen will, daß ich in Windows eine Klasse habe, die mit Handles (HBITMAP, HDC, HWND, HINSTANCE) arbeitet. Und da Handles ja Zeiger sind (void *), würde ich das eben gern so machen, daß, wann immer sie als Parameter übernommen werden und nicht geändert werden sollen, der Wert, auf den sie zeigen, konstant ist.<br />
Irgendeine Möglichkeit muß es da doch geben, sonst wäre das echt ein fehlendes Feature.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1083394</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1083394</guid><dc:creator><![CDATA[NES-Spieler]]></dc:creator><pubDate>Thu, 22 Jun 2006 20:37:56 GMT</pubDate></item><item><title><![CDATA[Reply to Konstante Zeiger als Parameter on Thu, 22 Jun 2006 20:42:55 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">typedef int* PINT;
typedef const int* CPINT;
</code></pre>
<p><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="😕"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1083396</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1083396</guid><dc:creator><![CDATA[Neku]]></dc:creator><pubDate>Thu, 22 Jun 2006 20:42:55 GMT</pubDate></item><item><title><![CDATA[Reply to Konstante Zeiger als Parameter on Thu, 22 Jun 2006 20:53:25 GMT]]></title><description><![CDATA[<p>Ja klar, so würde das natürlich gehen. Aber es geht ja hier darum, daß der Zeigertyp von außerhalb bereits vorgegeben ist: Ich habe einen mit typedef definierten Typ PIRGENDWAS und hätte diesen nun in der Weise konstant, wie ich es oben beschrieben habe. Da ist es ja kein guter Stil, sich erstmal anzugucken, was dieser Typ ursprünglich überhaupt war, und nun einen eigenen typedef auf Grundlage des Originaltyps zu machen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1083404</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1083404</guid><dc:creator><![CDATA[NES-Spieler]]></dc:creator><pubDate>Thu, 22 Jun 2006 20:53:25 GMT</pubDate></item><item><title><![CDATA[Reply to Konstante Zeiger als Parameter on Thu, 22 Jun 2006 20:59:40 GMT]]></title><description><![CDATA[<p>NES-Spieler schrieb:</p>
<blockquote>
<p>Mein konkretes Problem ist übrigens, wer es wissen will, daß ich in Windows eine Klasse habe, die mit Handles (HBITMAP, HDC, HWND, HINSTANCE) arbeitet. Und da Handles ja Zeiger sind (void *), würde ich das eben gern so machen, daß, wann immer sie als Parameter übernommen werden und nicht geändert werden sollen, der Wert, auf den sie zeigen, konstant ist.<br />
Irgendeine Möglichkeit muß es da doch geben, sonst wäre das echt ein fehlendes Feature.</p>
</blockquote>
<p>dass es ein void* ist, braucht eigentlich irgendwie nicht zu interessieren: denn der typ ist HBITMAP...</p>
<p>man kann den inhalt des void* ja auch nicht so einfach aendern <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="😉"
    /> dazu muss man sowieso casten und dann geht das const sowieso weg (sind ja in der winapi alles c casts... die machen n const aus &quot;versehen&quot; weg).</p>
<p>also passt schon. nenn es const HBITMAP und gut ist <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/1083408</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1083408</guid><dc:creator><![CDATA[Shade Of Mine]]></dc:creator><pubDate>Thu, 22 Jun 2006 20:59:40 GMT</pubDate></item><item><title><![CDATA[Reply to Konstante Zeiger als Parameter on Thu, 22 Jun 2006 21:02:34 GMT]]></title><description><![CDATA[<p>mit ein paar einfachen template metafunktionen ist das kein problem (ich benutze hier boosts typetraits, aber man kann sich das auch leicht selbst bauen).</p>
<pre><code class="language-cpp">typedef const boost::remove_pointer&lt;pointer2T&gt;::type* pointer2constT;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1083410</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1083410</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Thu, 22 Jun 2006 21:02:34 GMT</pubDate></item><item><title><![CDATA[Reply to Konstante Zeiger als Parameter on Thu, 22 Jun 2006 21:13:04 GMT]]></title><description><![CDATA[<p>NES-Spieler schrieb:</p>
<blockquote>
<p>Aber es geht ja hier darum, daß der Zeigertyp von außerhalb bereits vorgegeben ist.</p>
</blockquote>
<p>Genau darum geht es ja. Der Typ ist nunmal vorgegeben, also kannst du nur noch den Zeigertyp beeinflussen <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/1083413</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1083413</guid><dc:creator><![CDATA[Neku]]></dc:creator><pubDate>Thu, 22 Jun 2006 21:13:04 GMT</pubDate></item><item><title><![CDATA[Reply to Konstante Zeiger als Parameter on Thu, 22 Jun 2006 21:18:11 GMT]]></title><description><![CDATA[<p>An Shade of Mine:</p>
<p>const HBITMAP wäre ja wieder: Ich kann den Wert ändern, aber die Adresse nicht. In diesem Fall kann ich das const ja gleich weglassen, denn ob die Funktion intern den Zeiger verbiegen darf, ist nach außen hin sowieso unerheblich. Aber gerade das wollte ich nicht, sondern ich möchte es so machen, daß ein Außenstehender sieht, ob die Funktion intern den Wert ändern kann. (So wie in strcpy (char *, const char *): Da sieht man sofort: Der zweite Parameter wird nicht verändert. Und so wird das, soweit ich weiß, eigentlich fast überall geschrieben, wo Werte als Zeiger übergeben werden.)</p>
<p>Und nochmal zu der Sache mit dem selbst Erstellen von Typen: Wir haben jetzt natürlich den Vorteil, daß ein void * alles sein kann, und man das ganze somit direkt codieren könnte. Aber meiner Meinung ist das nur eine Verdrängung, aber keine Lösung des Problems. Wie gesagt, man stelle sich vor, jemand stellt den Typ PZAHL zur Verfügung. Die Zahl wird nie direkt verändert oder ausgegeben, das machen alles Funktionen, die sie als Parameter entgegennehmen. (Ja, ich weiß, heutzutage würde man dann eine Klasse schreiben, deren Methoden diese Funktionen wären, aber nehmen wir es nur mal an.) Und nun schreibe ich:</p>
<pre><code class="language-cpp">typedef const int *PCTZAHL
</code></pre>
<p>. Spätestens, wenn der Programmierer für PZAHL eine Struktur nimmt, dürfte ich Probleme bekommen.</p>
<blockquote>
<p>Genau darum geht es ja. Der Typ ist nunmal vorgegeben, also kannst du nur noch den Zeigertyp beeinflussen</p>
</blockquote>
<p>Aber ich kann bei einem P_NICHT_NAEHER_ERKLAERTER_TYP keinen PCT_NICHT_NAEHER_ERKLAERTER_TYP deklarieren, der vom Ursprungstyp ausgeht, sondern muß den direkt auf P_NICHT_NAEHER_ERKLAERTER_TYP basieren lassen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1083414</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1083414</guid><dc:creator><![CDATA[NES-Spieler]]></dc:creator><pubDate>Thu, 22 Jun 2006 21:18:11 GMT</pubDate></item><item><title><![CDATA[Reply to Konstante Zeiger als Parameter on Thu, 22 Jun 2006 21:21:18 GMT]]></title><description><![CDATA[<p>An camper:<br />
Soweit ich weiß, ist Boost (noch) kein Standard und ich benutze nicht so gerne Funktions- oder Klassensammlungen von außerhalb. Gibt es da ein Pendant in Standard-C++ (oder zumindest in der WinAPI), denn von so etwas habe ich noch nie gehört.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1083420</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1083420</guid><dc:creator><![CDATA[NES-Spieler]]></dc:creator><pubDate>Thu, 22 Jun 2006 21:21:18 GMT</pubDate></item><item><title><![CDATA[Reply to Konstante Zeiger als Parameter on Thu, 22 Jun 2006 21:45:51 GMT]]></title><description><![CDATA[<p>const FOO<br />
sagt dass du nicht<br />
foo=x<br />
machen kannst</p>
<p>was HBITMAP jetzt intern ist, hat dich nicht zu interessieren, das ist abstraktion.</p>
<p>es koennte zB morgen ein unsigned int sein und am tag darauf ein char* und am naechsten tag ne klasse...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1083425</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1083425</guid><dc:creator><![CDATA[Shade Of Mine]]></dc:creator><pubDate>Thu, 22 Jun 2006 21:45:51 GMT</pubDate></item><item><title><![CDATA[Reply to Konstante Zeiger als Parameter on Thu, 22 Jun 2006 22:15:38 GMT]]></title><description><![CDATA[<p>NES-Spieler schrieb:</p>
<blockquote>
<p>An camper:<br />
Soweit ich weiß, ist Boost (noch) kein Standard und ich benutze nicht so gerne Funktions- oder Klassensammlungen von außerhalb. Gibt es da ein Pendant in Standard-C++ (oder zumindest in der WinAPI), denn von so etwas habe ich noch nie gehört.</p>
</blockquote>
<p>das ist witzig, schließlich hat die WinAPI weitaus weniger mit standard C++ zu tun als boost <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="😉"
    /><br />
aber wie gesagt, das ganze kannst du dir auch selbst basteln:</p>
<pre><code class="language-cpp">template&lt;typename T&gt;struct remove_pointer { typedef T type; };
template&lt;typename T&gt;struct remove_pointer&lt;T*&gt; { typedef T type; };
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1083438</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1083438</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Thu, 22 Jun 2006 22:15:38 GMT</pubDate></item><item><title><![CDATA[Reply to Konstante Zeiger als Parameter on Fri, 23 Jun 2006 07:03:39 GMT]]></title><description><![CDATA[<blockquote>
<p>was HBITMAP jetzt intern ist, hat dich nicht zu interessieren, das ist abstraktion.<br />
es koennte zB morgen ein unsigned int sein und am tag darauf ein char* und am naechsten tag ne klasse...</p>
</blockquote>
<p>Deswegen sag ich ja, daß die Variante von Neku</p>
<pre><code class="language-cpp">typedef int* PINT; 
typedef const int* CPINT;
</code></pre>
<p>nicht geht, da sich das zweite typedef auf den neu erzeugten Typ und nicht auf den Originaltyp beziehen muß.</p>
<blockquote>
<p>das ist witzig, schließlich hat die WinAPI weitaus weniger mit standard C++ zu tun als boost</p>
</blockquote>
<p>Wie gesagt, meine Begründung war ja:</p>
<blockquote>
<p>ich benutze nicht so gerne Funktions- oder Klassensammlungen von außerhalb</p>
</blockquote>
<p>Die WinAPI ist zwar noch weitaus weniger Standard, aber sie ist zumindest in Visual C++ enthalten und ich muß nicht extra irgendwelche zusätzlichen Header und Libraries installieren. Aber das ist sowieso egal, denn von der WinAPI wird es für dieses Problem wohl keine Lösung geben. Deine Variante will ich mir mal ansehen, aber ich finde es noch immer ein Versäumnis, daß die Leute vom Standard-Kommitee offensichtlich keine Möglichkeit eingebaut haben, einen const typ * zu erzeugen, wenn typ * bereits als PTYP definiert ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1083545</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1083545</guid><dc:creator><![CDATA[NES-Spieler]]></dc:creator><pubDate>Fri, 23 Jun 2006 07:03:39 GMT</pubDate></item><item><title><![CDATA[Reply to Konstante Zeiger als Parameter on Fri, 23 Jun 2006 10:01:15 GMT]]></title><description><![CDATA[<p>NES-Spieler schrieb:</p>
<blockquote>
<blockquote>
<p>Genau darum geht es ja. Der Typ ist nunmal vorgegeben, also kannst du nur noch den Zeigertyp beeinflussen</p>
</blockquote>
<p>Aber ich kann bei einem P_NICHT_NAEHER_ERKLAERTER_TYP keinen PCT_NICHT_NAEHER_ERKLAERTER_TYP deklarieren, der vom Ursprungstyp ausgeht, sondern muß den direkt auf P_NICHT_NAEHER_ERKLAERTER_TYP basieren lassen.</p>
</blockquote>
<p>Bei dir ist es aber so:</p>
<p>EIN_TYP &lt;&lt; int<br />
P_EIN_TYP &lt;&lt; int*<br />
PC_EIN_TYP &lt;&lt; hier möchtest du EIN_TYP (int) durch ein const erweitern<br />
und wenn ich mich nicht irre ist dies nicht möglich</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1083673</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1083673</guid><dc:creator><![CDATA[Neku]]></dc:creator><pubDate>Fri, 23 Jun 2006 10:01:15 GMT</pubDate></item><item><title><![CDATA[Reply to Konstante Zeiger als Parameter on Fri, 23 Jun 2006 12:09:15 GMT]]></title><description><![CDATA[<p>Nicht mit nem normalen typedef</p>
<p>Bei makros (MS Praxis) wuerde es dem Standard-Orientierten C++ Anwender die Schuhe ausziehen</p>
<p>Den Typen in nen Wrapper kapseln und das ganze als Template waer unter c++ ne saubere Loesung, die scheint der Fragesteller aus diversen gruenden aber hartnaekisch zu ignorieren ^^</p>
<p>Keine Ahnung was dann ueber bleibt.</p>
<p>Ciao ...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1083765</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1083765</guid><dc:creator><![CDATA[RHBaum]]></dc:creator><pubDate>Fri, 23 Jun 2006 12:09:15 GMT</pubDate></item></channel></rss>