[解決済み] 定数ポインタと定数値へのポインタ [重複]の比較
2022-05-10 09:06:37
質問
次の宣言の違いは何ですか?
char * const a;
const char * a;
この違いを理解するために、こんな小さなプログラムを書いてみました。
#include <stdio.h>
#include <stdlib.h>
int main (int argc, char **argv)
{
char a = 'x';
char b = 'y';
char * const pc1 = &a;
const char * pc2 = &a;
printf ("Before\n");
printf ("pc1=%p\n", pc1);
printf ("*pc1=%c\n", *pc1);
printf ("pc2=%p\n", pc2);
printf ("*pc2=%c\n", *pc2);
*pc1 = b;
/* pc1 = &b; */
/* *pc2 = b; */
pc2 = &b;
printf ("\n\n");
printf ("After\n");
printf ("pc1=%p\n", pc1);
printf ("*pc1=%c\n", *pc1);
printf ("pc2=%p\n", pc2);
printf ("*pc2=%c\n", *pc2);
return EXIT_SUCCESS;
}
このプログラムを (gcc 3.4 で) コンパイルして実行しました。出力は、むしろその違いを強調しています。
Before
pc1=ffbfd7e7
*pc1=x
pc2=ffbfd7e7
*pc2=x
After
pc1=ffbfd7e7
*pc1=y
pc2=ffbfd7e6
*pc2=x
しかし、私は答えを得るために小さなプログラムを書かなければならなかった。しかし、その答えを得るために、小さなプログラムを書かなければならない。
どなたか、上記の例についてコメントすることで、どのように
const
キーワードがどのように動作するのかを説明していただけますか?
どのように解決するのですか?
char * const a;
は、ポインタは一定で不変だが、指し示されたデータは不変でないことを意味します。
を使うことができます。
const_cast
(C++の場合) または c-style cast を使って、データ自体は一定ではないので、この場合の constness を打ち消すことができます。
const char * a;
は、ポインタaを使用してポイントされたデータを書き込むことができないことを意味します。
を使用すると
const_cast
(C++) や c-style cast を使ってこの場合の constness を打ち消すと
未定義の動作
.
関連
-
[解決済み] 型付けされた関数ポインタ?
-
[解決済み] 初期化でポインタ対象の型から修飾語を捨てる
-
[解決済み] Linux Socket write() によるBad File Descriptor C
-
[解決済み] c または c++ 用のシンプルな 2 次元クロスプラットフォームグラフィックスライブラリ?[クローズド]
-
[解決済み] スマートポインターとは何ですか?
-
[解決済み] なぜ、オブジェクトそのものではなく、ポインタを使用しなければならないのですか?
-
[解決済み] Pythonで定数を作成するにはどうすればよいですか?
-
[解決済み] Cプリプロセッサはなぜ "linux "という単語を定数 "1 "と解釈するのですか?
-
[解決済み] ポインタの「デリファレンス」とはどういう意味ですか?
-
[解決済み] なぜC言語では構造体を頻繁にtypedefする必要があるのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
構造体の配列--[エラー] '['トークンの前に一次式があることが予想される
-
ポインタ定数および定数ポインタ
-
C 言語のポインタ配列のポインタ型、ポインタに値を割り当てるために配列名を使用、コンパイル時の警告:互換性のないポインタ型からの初期化
-
警告:符号付き整数式と符号なし整数式の比較 [-Wsign-compare]
-
[解決済み] munmap_chunk(): 無効なポインタ
-
[解決済み] Linuxカーネルにおけるcontainer_ofマクロの理解
-
[解決済み] C言語における「static」の意味とは?
-
[解決済み] while ( !feof (file) ) 」は、なぜいつも間違っているのですか?
-
[解決済み】char * constとconst char *の違いは何ですか?
-
[解決済み】定数ポインタと定数へのポインタの比較【重複