1. ホーム
  2. c

[解決済み] 定数ポインタと定数値へのポインタ [重複]の比較

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 を打ち消すと 未定義の動作 .