* 対 C の ** ポインター

この記事では、C と C++ における * ポインターと ** ポインターの違いについて説明しました。

目次:

1.ポインターとは

2.ポインターの例

3. C を使用したポインターの実装

4. *p vs **p ポインター

5. *p の実装 と **p Cの使用

ポインタとは?

ポインターは、別の変数のメモリにアドレスを格納するために使用される変数です。
ポインターで使用される 2 つの演算子:

  • 演算子 &:- 変数のアドレスを与える
  • Operator * :- 位置の値を与える

いくつかのポイント:

  • 住所を負の値にすることはできません。
  • ポインタ変数は、データ型に関係なく同じバイトのメモリを使用します。
  • ポインタ変数のサイズは、オペレーティング システムに応じてシステムごとに異なります。
  • ポインター変数は no を逆参照できます。データ型に応じたバイト数。
    * 整数ポインタは 2 バイトのデータを逆参照できます。
    ※文字ポインタは 1 バイトのデータにアクセスできます。
    * 浮動小数点ポインターは 4 バイトのデータにアクセスできます。
  • ポインター変数は「*」(アスタリスク)を使用して宣言されます。

ポインタの例:

<オール>
  • int * p ;         // Declaration of pointer ‘p’  
    int a = 10 ;  
    p = &a ;          //Assigning 
                      //now pointer ‘p’ is pointing at variable ‘a’.  
    

    ここでは、メモリ ブロック 'a' を宣言してポインター 'p' に割り当てています。

    • 「p」は、任意の整数変数のアドレスを格納できる整数型のポインター変数です。
    • 「a」は値 10 を格納する整変数です。
    int * p ; 
    int a = 10 , b ;  
    b = &a ;          //ERROR
    

    ここでは、整数 'a' のアドレスを別の整数 'b' に格納しようとしているため、エラーが表示されます

    int a = 10 ;
    printf(" a = %d " , * &a );   // output will be a = 10 
    

    ここでは、「a」の値をポインターとして表して出力しています。簡単に言うと、a=``*&a .

    int * p ; 
    int a = 10 ;  
    p = &a ;  
    printf(" %d " , a * p ) ;   // ERROR
    
    printf(" %d " , a * * p );  // No ERROR
    

    'a' が値 (=10) と *p を持っているため、エラーが表示されます。 も値(=10)を持っていますが、コンパイラはそれを printf(" %d ", (a) (*p ) ); 、コンパイラ用の算術演算子はありません。
    しかし、次の printf() ステートメントではエラーは表示されません。これは、'a' と *p の乗算を行っているため、コンパイラが出力を 100 として出力するためです。 両方とも value(=10) を含んでいます。

    C を使用したポインターの実装

    #include<stdio.h>
    int main(){
      int a=10;
      int * p = &a ;
      printf("  a = %d \n " , * p ) ;   // It gives output a = 10
      printf(" Address of a = %p \n ", p ) ;  // It gives output Address of a
      printf(" Address of p = %p \n ", & p ) ; // It gives output Address of p
    return 0;
    }
    

    ここでは、'a' の値と 'a' と 'p' のアドレスを出力します。

    出力:

      a = 10
      Address of a = 000000000061FE1C
      Address of p = 000000000061FE10
    

    *p vs **p ポインター

    *p ポインタです。値のアドレスまたは予約済みメモリのブロックを保持することを意味します。1 レベルまでアクセスできます。
    値が入っているメモリのブロックを保持したい場合に使用されます。

    **p ポインタへのポインタです。値のアドレスまたは予約メモリのブロックを保持するアドレスを保持することを意味します。最大 2 つのレベルにアクセスできます。
    別の関数で割り当てられたメモリを取得するポインターを渡したい場合に使用されます。

      #include<stdio.h>
      int main(){
      int a=10;
      int * p = & a ;              // b is a single pointer or a pointer
      int ** c = &p;         // c is a double pointer or pointer to a pointer 
      printf("using p \n ");
      printf(" value of a = %d \n " , * p ) ;  // It gives output value of a = 10
      printf(" Address of a = %p \n ", p ) ;    // It gives output Address of a
      printf(" Address of p = %p \n", & p ) ;  // It gives output Address of p
      printf("using c \n ");
      printf(" value of a = %d \n ", ** c ) ;    //  It gives output value of a
      printf(" Address of a = %p \n ", * c ) ;   // It gives output Address of a
      printf(" Address of c = %p \n ", &c ) ;   // It gives output Address of c
      printf(" Address of p = %p \n ",  c ) ;   // It gives output Address of p
      return 0;
      }
    

    ここでは、ポインタとダブル ポインタを使用して値とアドレスを出力しています。

    出力:

    using p
    value of a = 10
    Address of a = 000000000061FE1C
    Address of p = 000000000061FE10
    using c
    value of a = 10
    Address of a = 000000000061FE1C
    Address of c = 000000000061FE08
    Address of p = 000000000061FE10
    

    *p の実装 と **p Cの使用

    <オール>
  • #include<stdio.h>
    void swap(int * x ,int * y ){
    int t = * x ;
     * x = * y ;
     * y = t ;
    }
    int main(){
      int a = 10 , b = 20 ;
      printf(" Value of 'a' before swap = %d \n", a );
      printf(" Value of 'b' before swap = %d \n", b );
    
      swap( & a , & b ) ;         //function call
      
      printf(" Value of 'a' after swap = %d \n", a );
      printf(" Value of 'b' after swap = %d \n", b );
    
    return 0;
    }
    

    2 つの数字を交換 ポインターを使用します。
    関数 swap() を呼び出している間、メモリ ブロックのアドレス (つまり、a、b) を送信し、それらのアドレスを取得するために、swap() の引数として整数ポインター (つまり、x、y) を取得しています。
    関数 swap() では、アドレスの値を交換しています。

    出力:

     Value of 'a' before swap = 10
     Value of 'b' before swap = 20
     Value of 'a' after swap = 20
     Value of 'b' after swap = 10
    
    #include<stdio.h>
    
    void func(int ** p1 )
    {
        int b = 2;
        * p1 = & b;
    }
    
    int main()
    {
        int a = 10;
        int * p = &a;
        printf("Before the function, value of the p : %d \n", * p) ;
        func(&p);    //function Call
        printf("After the function, new value of the p : %d \n", * p) ;
    
    return 0;
    }
    

    ここでは、まず整数 'a' を取得し、それに値 10 を割り当てます。
    次に、整数ポインタ「p」を取得し、「a」のアドレスを「p」に割り当てます。
    関数呼び出し func() では、ポインターである 'p' のアドレスを指定しています。ポインターのアドレスを取得するには、関数 func() が引数としてポインターへの整数ポインターを持っている必要があります (つまり、func の p1 (p1) )。
    func() では、値を 10 から 2 に変更しています。

    出力:

    Before the function, value of the p : 10
    After the function, new value of the p : 2
    

    OpenGenus のこの記事を読むと、C での * と ** ポインターの完全なアイデアが得られるはずです。