C言語——定数ポインタ、ポインタ定数および定数を指すポインタ定数の3つの違いの詳細

4611 ワード

C言語——定数ポインタとポインタ定数の違い
定数ポインタ、ポインタ定数、および定数を指すポインタ定数の概念の簡単な説明
定数ポインタ:const修飾が宣言されたタイプを表す.例:
//  char const *p const char *p    。
void consttest(const char *p)  
{ 
    printf("p[1]=%c
"
,p[1]); p=1;// *(p+1)='a';// }

const修飾はcharであるため,pが指すメモリアドレスに対応する値はconstであるため修正できない.ただし、ポインタが指すメモリアドレスはconstタイプではないため変更できます.
ポインタ定数:constが変更したポインタを表します.
例:
void testconst(char *const p) 
{ 
    char *tmp="13213"; 
    p=1;;//  
    p=tmp;;//  
    p[1]='a';//  
    *(p+1)='a';//  
} 

constはポインタpを修飾するため、すなわち、ポインタが指すメモリアドレスはconstであり、変更できない.ただし、pが指すメモリアドレスに対応する値はconstタイプではないため変更可能である.
定数を指すポインタ定数:constはタイプとポインタを同時に修飾します.読み取り専用:
void consttestconst(const char *const p) 
{ 
    p=1;//  
    p[1]='a';//  
} 

constはこのタイプとポインタを同時に修飾するため、つまりポインタが指すメモリアドレスは変更できないと同時にメモリアドレスに対応する値も変更できない.
まとめ:主にconstが置かれている位置を見ます.
1)constは*の前にあります:constが修飾したものが明示されたタイプであることを表します.定数ポインタ
2)constは*の後:const修飾を示すポインタである.ポインタ定数
3)前*後には、constがタイプとポインタを同時に変更していることを示します.ポインタ定数
constの利点
C/C++のキーワードconstは、読み取り専用の変数またはオブジェクトを定義するために使用され、次の利点があります.
(1)関数の関数fun(const int a)aの値が変化を許さないなどのタイプチェックが容易であり、実パラメータの保護が容易である.(2)マクロ定義と同様に機能し、パラメータの修正と調整が容易である.const int max=100;(3)空間を節約し、a=max、b=maxを再定義すれば...maxに空間を割り当てるのではなく、マクロで定義すればマクロを常に置換し、変数に空間を割り当てる(4)関数のリロードに参考を提供する
定数ポインタとポインタ定数の違い
次に例を用いて定数ポインタとポインタ定数を解析し,まず定数ポインタとポインタ定数の違いをまとめる.
まず、どの定義方式が定数ポインタなのか、どのポインタ定数なのかを理解しなければなりません.ここでは、3つの言葉を覚えて記憶を深めることができます.
  • (ポインタ)とconst(定数)は、誰が先に誰を読むか、*住所を象徴し、constは内容を象徴し、誰が前にいるかは変更できません.
  • では、この例を見てみましょう.
    int a =3;
    int b = 1;
    int c = 2;
    int const *p1 = &b;//const   ,       
    int *const p2 = &c;//*  ,        

    定数ポインタp 1:指向するアドレスは変更可能であるが、コンテンツは再付与できず、コンテンツの変更はアドレス指向を変更して変換するしかない.
    p 1=&aは正しいが、*p 1=aは間違っている.
    ポインタ定数p 2:指向するアドレスは再付与できないが、内容は変更でき、初期化しなければならず、アドレスは一生続く.
    p 2=&aは誤り、*p 2=aは正しい.
    定数ポインタ、ポインタ定数についての知識点補足
    1.概念:定数ポインタとは–定数を指すポインタであり、その名の通り、ポインタが定数を指す.すなわち、変数を指すことができず、ポインタが指す内容を変更することができず、ポインタによってその指す内容を修正することはできないが、ポインタ自体は定数ではなく、それ自体の値を変更することができ、それによって別の定数を指すことができる.ポインタ定数とは、-ポインタ自体が定数です.アドレスは変更できませんが、アドレスの内容はポインタで変更できます.ライフサイクルが終わるまで、アドレスは一生を伴います.ポインタ定数は、定義時に初期値を同時に付与する必要があることに注意してください.注:この2つの名前の定義と意味を逆に考える人もいます.「ポインタ定数:その名の通りその中心語は「定数」です.これがポイントで、ポインタは修飾の役割です.したがって、ここのポインタは変数であり、その内容は定数のアドレスを格納しています.定数ポインタ:キーワードはポインタであり、ポインタは常にアドレスを指しているので、ポインタが指すアドレスは変更できないことを意味します.しかし、個人的には後者は不合理だと思いますので、前者を使います.2.使用方法:使用時の書き方の違い:定数ポインタ:constの前のポインタ定数:constの後.もちろん定数ポインタ定数を定義することもできますが、2つのconstを追加する必要があります.以上は定義的に両者の本質的な違いを与えただけで、具体的な使用上、まだ多くの変化があるが、万変はその宗から離れず、私たちはその原理に基づいて様々な複雑な用法の実質を分析することができる.
    3.テクニックを使用してポインタ定数を使用すると、コードの信頼性と実行効率を向上させることができます.次のようになります.
    Int a;
    Int * const p =&a;

    信頼性の向上:pが修正または解放されて予想外の結果をもたらす心配はありません.実行効率の向上:サブ関数でpを空のチェックをしなくても効率が向上します.