C言語——配列とポインタ、配列ポインタ、ポインタ配列
12416 ワード
配列とポインタ、配列ポインタ、ポインタ配列 1.配列とポインタ 関係及び基本使用 ポインタによる演算 2. 配列ポインタ(行ポインタとも呼ばれる) 定義 3.ポインタ配列 定義 ポインタ優先度 4.ポインタ配列と配列ポインタの違い 1.配列とポインタ
関係及び基本使用
配列は、メモリに連続したメモリ領域を表すデータの集合です.現在宣言されているintタイプの配列の場合、配列タイプは3であり、intタイプのポインタでヘッダアドレスを指すことができ、ポインタで配列を操作することができます.
上記コードでは,ポインタ方式で配列を操作し,配列の最初の要素を100から400に変換する.
ポインタによる演算
答えは肯定的で、*pの基礎の上で1をプラスするだけで、第2の要素を指すことができます
このコードは上のコードに比べてほぼ同じで、*pが付与された文だけが修正され、実行結果は、配列の2番目の要素値が修正され、
考えてみてください.私たちの+1の操作は、現在のタイプに対して+1を行い、intタイプで4バイトです.では、+1はメモリの中で4バイトのステップを歩きます.byte値タイプの場合、ポインタタイプに基づいて、対応するステップ長を+1バイトだけ歩くと仮定します.
4 Gメモリがあると仮定し、メモリの各領域を符号化すると、符号化されたメモリは現在のポインタであり、intタイプの配列を仮定すると、その長さは3であり、メモリ内の連続性の領域では、配列のヘッダをポインタに割り当て、このポインタは、配列内の各要素を操作する能力があります.
2.配列ポインタ(行ポインタとも呼ばれる)
定義#テイギ#
優先度が高く、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.ポインタ配列
定義#テイギ#
ポインタ配列、その名の通り、この配列の各要素は、ポインタです.
メモリ領域があると仮定します.このメモリ領域には配列があります.この配列の各要素はアドレスに格納されています.このアドレス分布は変数を指しています.このように、このような配列をポインタ配列と呼びます.
コード実装:
ポインタ優先度
ポインタ配列では
定義:
() > []> *
振り返ってみると、さっきの声明
このポインタ配列にint型変数を付与することはできず,アドレスのみを付与し,各要素にアドレスを付与することができる.取るときも、保存するルールに従い、*を付けて、アドレスを指す変数を表します.これがポインタ配列です.
4.ポインタ配列と配列ポインタの違い
ポインタ配列は配列を表し、各要素にはアドレスが格納されています.配列ポインタは配列ではなく、変数にすぎません.この変数は、このポインタに置かれていますが、2 D配列のヘッダアドレスを指し、現在のポインタを+1操作すると、2行目のヘッダアドレスを指します.
書き方に大きな違いはなく、一つの()を加えただけですが、確かに表示形式が全然違います.
関係及び基本使用
配列は、メモリに連続したメモリ領域を表すデータの集合です.現在宣言されている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行目のヘッダアドレスを指します.
書き方に大きな違いはなく、一つの()を加えただけですが、確かに表示形式が全然違います.