web-dev-qa-db-ja.com

定数ポインタvs定数へのポインタ

違いを知りたい

const int* ptr;

そして

int * const ptr; 

そしてそれはどのように機能します。

これを理解することや覚えておくことは私にとってかなり困難です。助けてください。

100
vengets
const int* ptr; 

ptrconst int型へのポインタとして宣言します。 ptr自体を変更することはできますが、ptrが指すオブジェクトは変更されません。

const int a = 10;
const int* ptr = &a;  
*ptr = 5; // wrong
ptr++;    // right  

しながら

int * const ptr;  

ptrconst型へのintポインタとして宣言します。 ptrを変更することは許可されていませんが、ptrが指すオブジェクトは変更できません。

int a = 10;
int *const ptr = &a;  
*ptr = 5; // right
ptr++;    // wrong

一般的に私は読みやすく理解しやすくするためにこのような宣言を好むでしょう(右から左へ読む):

int const  *ptr; // ptr is a pointer to constant int 
int *const ptr;  // ptr is a constant pointer to int
175
haccks
const int * ptr;

ポイントされたデータは定数で不変であるがポインタはそうではないことを意味します。

int * const ptr;

ポインターは定数で不変ですが、ポイントされたデータはそうではありません。

22
Itachi

1)定数ポインタ:これらのタイプのポインタは、それらが指しているアドレスを変更できないものです。これは、変数を指す(またはその変数のアドレスを格納する)ポインタがあると想定していることを意味します。ポインターを他の変数にポイントさせようとした場合(またはポインターに他の変数のアドレスを保管させようとした場合)、定数ポインターはこれを実行できません。

定数ポインタは、次のように宣言されます。int *const ptr( 'const'の位置は、ポインタ 'ptr'を定数ポインタにします)

2)定数へのポインタ:これらのタイプのポインタは、それらが指している値を変更できないものです。つまり、アドレスを保持している変数の値を変更することはできません。

定数へのポインタは、次のように宣言されます。const int *ptr( 'const'の位置は、ポインタ 'ptr'を定数へのポインタにします。

定数ポインタ

#include<stdio.h>

int main(void)
{
    int a[] = {10,11};
    int* const ptr = a;

    *ptr = 11;

    printf("\n value at ptr is  : [%d]\n",*ptr);
    printf("\n Address pointed by ptr  : [%p]\n",(unsigned int*)ptr);

    ptr++;
    printf("\n Address pointed by ptr  : [%p]\n",(unsigned int*)ptr);

    return 0;
}

さて、上記のコードをコンパイルすると、コンパイラは次のように文句を言います。

practice # gcc -Wall constant_pointer.c -o constant_pointer
constant_pointer.c: In function ‘main’:
constant_pointer.c:13: error: increment of read-only variable ‘ptr’

したがって、定数ポインタによって保持されているアドレスを変更することはできないとコンパイラが不平を言っていることが、上で明確にわかります。

定数へのポインタ

#include<stdio.h>

int main(void)
{
    int a = 10;
    const int* ptr = &a;


    printf("\n value at ptr is  : [%d]\n",*ptr);
    printf("\n Address pointed by ptr  : [%p]\n",(unsigned int*)ptr);

    *ptr = 11;

    return 0;
}

さて、上記のコードがコンパイルされるとき、コンパイラは文句を言います:

practice # gcc -Wall pointer_to_constant.c -o pointer_to_constant
pointer_to_constant.c: In function ‘main’:
pointer_to_constant.c:12: error: assignment of read-only location ‘*ptr’

したがって、ここでもコンパイラは、指すポインタの変数の値を変更するための定数へのポインタを許可していないことがわかります。

見積

8
MustafaP

からの参照 This Thread

定数ポインタ

まず定数ポインタとは何かを理解しましょう。定数ポインタは、アドレスを保持しているアドレスを変更できないポインタです。言い換えれば、定数ポインタがいったん変数を指すと、それは他の変数を指すことはできません。

定数ポインタは次のように宣言されています。
<type of pointer> * const <name of pointer>
宣言の例は次のようになります。
int * const ptr;
これらの種類のポインタを説明するために、小さなコードを使用しましょう。

#include<stdio.h>

int main(void)
{
    int var1 = 0, var2 = 0;
    int *const ptr = &var1;
    ptr = &var2;
    printf("%d\n", *ptr);

    return 0;
} 

上記の例では:

  • 2つの変数var1とvar2を宣言しました。
  • 定数ポインタptrが宣言され、var1を指すようにされました
  • 次にptrにvar2を指すようにします。
  • 最後に、ptrが指している値を表示します。

定数へのポインタ

名前から明らかなように、それが指す変数の値を変更することができないポインタは、定数へのポインタとして知られています。これらのタイプのポインターは、それらが指すアドレスを変更できますが、それらのアドレスに保持されている値を変更することはできません。

定数へのポインタは次のように定義されます。const <type of pointer>* <name of pointer>定義の例は次のようになります。const int* ptr;定数へのポインタを示すために小さなコードを見てみましょう。

 #include<stdio.h>

int main(void)
{
    int var1 = 0;
    const int* ptr = &var1;
    *ptr = 1;
    printf("%d\n", *ptr);

    return 0;
} 

上記のコードでは:

  • 値が0の変数var1を定義しました。
  • 変数var1を指す定数へのポインタを定義しました。
  • さて、このポインタを通してvar1の値を変えようとしました
  • 新しい値を印刷するためにprintfを使用しました。
4
G one
const int* ptr;

定数(コンテンツ)へのポインタです。あなたはポインタを修正することを許されています。例えばptr = NULLptr++、しかし内容の修正は可能ですではない可能です。

int * const ptr;

定数ポインタです。逆も可能です。あなたはnotポインタを変更することを許可されていますが、あなたはareそれが指すものを変更することを許可されています。 *ptr += 5

3
Sergey L.
int i;
int j;

int * const ptr1 = &i;

コンパイラはptr1の変更を中止します。

const int * ptr2 = &i;

コンパイラは*ptr2の変更を中止します。

ptr1 = &j; // error
*ptr1 = 7; // ok

ptr2 = &j; // ok
*ptr2 = 7; // error

*ptr2を文字通りに入力することによってではなく、*ptr2を変更することができることに注意してください。

i = 4;
printf("before: %d\n", *ptr2); // prints 4
i = 5;
printf("after: %d\n", *ptr2); // prints 5
*ptr2 = 6; // still an error

両方の機能を持つポインタを持つこともできます。

const int * const ptr3 = &i;

ptr3 = &j; // error
*ptr3 = 7; // error
2
immibis

ここでconst int* ptr;は* ptrは定数で、* ptrは再び変更できないように考えます

int * const ptr;は、ここではptrを定数と考えていますが、これを変更することはできません。

1
user2760375

Constポインタと定数値上のPointerの違いについては、次のリンクを参照してください。

定数ポインタと定数値へのポインタ

1
SridharKritha