C での簡単なポインター配列の初期化:ヒントとベスト プラクティス
ポインタは、別の変数のアドレスを格納する変数です。ポインター変数の名前には、先頭に「*」記号を付ける必要があります。通常の変数の場合と同様に、配列の各添え字が配列型のアドレスを保持する「ポインターの配列」を宣言することもできます。
C でポインタの配列を初期化するにはどうすればよいですか?
ポインタ変数は、宣言時に既存の変数のアドレスを割り当てることで初期化できます。次のスニペットは、ポインタを初期化する方法を示しています -
int x = 10; int *y = &x;
デフォルトでは、ポインタ変数を含むすべての変数は「オートストレージクラス」に属します。これは、ポインタ変数が予測不可能でガベージなランダム メモリ アドレスを格納することを意味し、未定義の動作やセグメンテーション フォールト エラーなどのプログラムへの潜在的なリスクを引き起こす可能性があります。したがって、宣言時に保存する特定の値がない場合は、NULL に初期化する必要があります。
int *ptr = NULL;
「ポインタ配列」には各要素にアドレスが格納されます。配列の型はターゲット変数の型と一致する必要があります。
static キーワードを使用してポインタの配列を初期化する
static キーワードを使用してポインタの配列を初期化し、各添字に「0」を格納することもできます。
例
#include <stdio.h>
int main(){
static int *ptr[5];
for (int i = 0; i < 5; i++){
printf("ptr[%d] = %d\n", i, ptr[i]);
}
return 0;
}
出力
コードを実行し、その出力を確認します-
ptr[0]= 0 ptr[1]= 0 ptr[2]= 0 ptr[3]= 0 ptr[4]= 0
整数ポインタの配列を初期化する
ここでは、整数ポインターの配列を宣言し、3 つの整数変数のアドレスを格納します。
例
#include <stdio.h>
int main(){
int a = 10, b = 20, c = 30;
int *ptr[3] = {&a, &b, &c};
for (int i = 0; i < 3; i++){
printf("ptr[%d]: address: %d value: %d\n", i, ptr[i], *ptr[i]);
}
return 0;
}
出力
コードを実行し、その出力を確認します-
ptr[0]: address: 6422040 value: 10 ptr[1]: address: 6422036 value: 20 ptr[2]: address: 6422032 value: 30
直接アドレスによるポインタの配列の初期化
通常の配列の各要素のアドレスを、ポインタ配列の対応する要素に格納できます。
例
#include <stdio.h>
int main(){
int arr[] = {10, 20, 30};
int *ptr[3] = {&arr[0], &arr[1], &arr[2]};
for (int i = 0; i < 3; i++){
printf("ptr[%d]: address: %d value: %d\n", i, ptr[i], *ptr[i]);
}
return 0;
}
出力
コードを実行し、その出力を確認します-
ptr[0]: address: 6422032 value: 10 ptr[1]: address: 6422036 value: 20 ptr[2]: address: 6422040 value: 30
ベース アドレスを使用して配列を走査する
配列のベース アドレス (この場合は「&arr[0]」) を取得すると、ポインターがデータ型のサイズによって増加することがわかっているため、後続の要素のアドレスを取得できます。
したがって、ベース アドレス (配列の名前は 0 番目の要素のアドレスと同じです) だけを使用して、配列を走査することができます。
例 1
次の例を見てください-
#include <stdio.h>
int main(){
int arr[] = {10, 20, 30};
int *ptr=arr;
for (int i = 0; i < 3; i++){
printf("ptr[%d]: address: %d value: %d\n", i,ptr+i, *(ptr+i));
}
return 0;
}
出力
コードを実行し、その出力を確認します-
ptr[0]: address: 6422020 value: 10 ptr[1]: address: 6422024 value: 20 ptr[2]: address: 6422028 value: 30
例 2:ポインタ配列を使用した 2D 配列の走査
この例では、2D 配列があります。各行の 0 番目の要素のアドレスがポインタ配列に格納されます。トラバースすると、対応する行の 0 番目の要素を指すポインタ配列の各要素に格納されたアドレスが増加し、各行の値をフェッチします。
#include <stdio.h>
int main(){
// 2d array
int arr[3][4] = {
{1, 2, 3, 4},
{5, 6, 7, 8},
};
int ROWS = 2, COLS = 4;
int i, j;
// pointer
int (*ptr)[4] = arr;
// print the element of the array via pointer ptr
for (i = 0; i < ROWS; i++) {
for (j = 0; j < COLS; j++) {
printf("%d ", *(ptr[i]+j));
}
printf("\n");
}
return 0;
}
出力
このコードを実行すると、次の出力が生成されます-
1 2 3 4 5 6 7 8
例 3
この 2D 配列の名前をベース ポインターとして使用し、それを行方向および列方向にインクリメントして、指定された 2D 配列内の要素をフェッチできるため、ここでは実際にはポインター配列は必要ありません。
#include <stdio.h>
int main(){
// 2d array
int arr[3][4] = {
{1, 2, 3, 4},
{5, 6, 7, 8},
};
int ROWS = 2, COLS = 4;
int i, j;
// pointer
int *ptr = arr;
// print the element of the array via pointer ptr
for (i = 0; i < ROWS; i++){
for (j = 0; j < COLS; j++){
printf("%d ", *(ptr + i * COLS + j));
}
printf("\n");
}
return 0;
}
出力
出力は前のコードの出力と似ています -
1 2 3 4 5 6 7 8
文字ポインタの配列 (文字列) を初期化します
C プログラミングでは、文字列は char データ型の配列です。配列の名前はその 0 番目の要素のアドレスも表すため、文字列は −
として宣言できます。char arr[] = "Hello";
ポインタ表記を使用すると、文字列は −
として char ポインタに割り当てられます。char *arr = "Hello";
次に、次のように複数の文字列を格納するための char ポインタの配列を宣言できます-
char *arr[3] = {"string1", "string2", "string3", . . . };
例
次の例には、コンピューター言語の名前を保存するために使用される char ポインターの配列が含まれています -
#include <stdio.h>
int main(){
char *langs [10] = {
"PYTHON", "JAVASCRIPT", "PHP",
"NODE JS", "HTML", "KOTLIN", "C++",
"REACT JS", "RUST", "VBSCRIPT"
};
for(int i = 0; i < 10; i++)
printf("%s\n", langs[i]);
return 0;
}
出力
このコードを実行すると、次の出力が生成されます-
PYTHON JAVASCRIPT PHP NODE JS HTML KOTLIN C++ REACT JS RUST VBSCRIPT
このプログラムでは、「langs」は 10 個の文字列の配列へのポインタです。したがって、「langs[0]」がアドレス 5000 を指す場合、「langs + 1」は 2 番目の文字列へのポインタを格納するアドレス 5004 を指します。
したがって、次のループのバリエーションを使用して文字列の配列を出力することもできます-
for (int i = 0; i < 10; i++){
printf("%s\n", *(langs + i));
}
ポインタの動的配列の初期化
malloc() 関数を使用すると、ポインタの配列を動的に宣言して初期化できます。
例
次の例を見てください-
#include <stdio.h>
int main(){
int *arr = (int *)malloc (sizeof (int) * 5);
for(int i = 0; i < 5; i++){
arr[i] = i;
}
for (int x = 0; x < 5; x++){
printf("%d %d\n", x, arr[x]);
}
return 0;
}
出力
このコードを実行すると、次の出力が生成されます-
0 0 1 1 2 2 3 3 4 4
ユーザー入力を求めて、配列のポインタの要素に値を割り当てることもできます -
for(i = 0; i < 5; i++){
scanf("%d", &x);
arr[i] = x;
}
C言語