C言語——配列とポインタ、配列ポインタ、ポインタ配列

12416 ワード

配列とポインタ、配列ポインタ、ポインタ配列
  • 1.配列とポインタ
  • 関係及び基本使用
  • ポインタによる演算
  • 2. 配列ポインタ(行ポインタとも呼ばれる)
  • 定義
  • 3.ポインタ配列
  • 定義
  • ポインタ優先度
  • 4.ポインタ配列と配列ポインタの違い
  • 1.配列とポインタ
    関係及び基本使用
    配列は、メモリに連続したメモリ領域を表すデータの集合です.現在宣言されているintタイプの配列の場合、配列タイプは3であり、intタイプのポインタでヘッダアドレスを指すことができ、ポインタで配列を操作することができます.
    #include
    
    
    void main(){
    	int arr[] = { 100, 200, 300 };
    	for (int i = 0; i < 3; i++)
    	{
    		printf("  %d
    "
    , arr[i]); } printf("======================
    "
    ); int* p = &arr; *p = 400; for (int i = 0; i < 3; i++) { printf(" %d
    "
    , arr[i]); } system("pause"); }

    上記コードでは,ポインタ方式で配列を操作し,配列の最初の要素を100から400に変換する.
    ポインタによる演算int* p = &arr;これは私たちがさっき設定した変数です.この変数が配列を指しているとき、実際には配列の最初のアドレス、すなわち配列の最初の要素を指しています.では、このポインタを2番目の要素を指してもいいですか.
    答えは肯定的で、*pの基礎の上で1をプラスするだけで、第2の要素を指すことができます
    #include
    
    
    void main(){
    	int arr[] = { 100, 200, 300 };
    	for (int i = 0; i < 3; i++)
    	{
    		printf("  %d
    "
    , arr[i]); } printf("======================
    "
    ); int* p = &arr; *(p+1) = 400; for (int i = 0; i < 3; i++) { printf(" %d
    "
    , arr[i]); } system("pause"); }

    このコードは上のコードに比べてほぼ同じで、*pが付与された文だけが修正され、実行結果は、配列の2番目の要素値が修正され、*(p+1) = 400;がポインタ演算と呼ばれます.
    考えてみてください.私たちの+1の操作は、現在のタイプに対して+1を行い、intタイプで4バイトです.では、+1はメモリの中で4バイトのステップを歩きます.byte値タイプの場合、ポインタタイプに基づいて、対応するステップ長を+1バイトだけ歩くと仮定します.
    4 Gメモリがあると仮定し、メモリの各領域を符号化すると、符号化されたメモリは現在のポインタであり、intタイプの配列を仮定すると、その長さは3であり、メモリ内の連続性の領域では、配列のヘッダをポインタに割り当て、このポインタは、配列内の各要素を操作する能力があります.
    2.配列ポインタ(行ポインタとも呼ばれる)
    定義#テイギ#
    int (*p)[n]
    

    優先度が高く、pがポインタであることを示し、整数の1次元配列を指し、この1次元配列の長さはnであり、pのステップ長とも言える.すなわち,p+1を実行する場合,pはn個の整数データの長さにまたがる.
    int a[3][4]; int (*p)[4];//この文は、4つの要素を含む1次元配列p=aを指す配列ポインタを定義します.//この2次元配列のヘッダアドレスをp,すなわちa[0]または&a[0][0]p+//に割り当てる.この文が実行された後、すなわちp=p+1である.横断行a[0][aを指す[1][]
    3.ポインタ配列
    定義#テイギ#
    ポインタ配列、その名の通り、この配列の各要素は、ポインタです.
    メモリ領域があると仮定します.このメモリ領域には配列があります.この配列の各要素はアドレスに格納されています.このアドレス分布は変数を指しています.このように、このような配列をポインタ配列と呼びます.
    コード実装:
    #include
    
    void main(){
    	int arr[] = { 100, 200, 300 };
    	int *p[3];//    
    	for (int i = 0; i < 3; i++)
    	{
    		p[i] = &arr[i];
    	}
    
    	for (int i = 0; i < 3; i++)
    	{
    		printf("  %d
    "
    , *p[i]); } system("pause"); }

    ポインタ優先度
    ポインタ配列ではint *p[3];という式が優先されています
    定義:
    () > []> *
    振り返ってみると、さっきの声明int *p[3];は先に結合した*p[3]で、それは1つの配列を代表して、配列種の各要素のタイプを代表して、1つのポインタを代表して、だからそれは1つのポインタの配列で、各要素はポインタの変数を保存しています.前のintを見てみると、このポインタ配列種に格納されている各ポインタ変数は、intタイプを指す値であることを示しています.
    このポインタ配列にint型変数を付与することはできず,アドレスのみを付与し,各要素にアドレスを付与することができる.取るときも、保存するルールに従い、*を付けて、アドレスを指す変数を表します.これがポインタ配列です.
    4.ポインタ配列と配列ポインタの違い
    ポインタ配列は配列を表し、各要素にはアドレスが格納されています.配列ポインタは配列ではなく、変数にすぎません.この変数は、このポインタに置かれていますが、2 D配列のヘッダアドレスを指し、現在のポインタを+1操作すると、2行目のヘッダアドレスを指します.
    書き方に大きな違いはなく、一つの()を加えただけですが、確かに表示形式が全然違います.