配列へのポインターを使用できる場所を理解するのに苦労していますchar (*a)[10];
。2 つの基本的な質問です。
- C コードで配列へのポインターを使用する方法の簡単な例を教えてください。
- 変数をポインターとして宣言し、そのポイントの後にアドレスをインクリメント/デクリメントするのとは対照的に、なぜそれを使用するのでしょうか。
多次元配列型の式を関数に渡すときはいつでも、配列へのポインターを操作することになります。
int a[10][20];
foo(a);
void foo(int (*p)[20]) // or int p[][20]
{ ... }
文字列のセットを返すデータベース クエリがあるとします。さらに、これらの文字列の長さが 9 文字以内であることを知っているとします。ただ、クエリによって返されるセットに含まれる要素の数はわかりません。
char (*a)[10] = malloc( NumRecords * sizeof *a );
if ( a == NULL )
{
/* Handle error appropriately */
return EXIT_FAILURE; /* Naive */
}
for ( i = 0 ; i < NumRecords ; ++i )
{
assert(strlen(DbRecordSet[i]) < 10);
strcpy(a[i], DbRecordSet[i]);
}
例:num_row
行と 3 列の配列の要素を出力する方法:
#include <stdio.h>
#define NUM_ROW(x) (sizeof (x) / sizeof *(x))
// print elements of an array of num_row rows and 3 columns
void print(int (*a)[3], size_t num_row)
{
size_t num_col = sizeof *a / sizeof **a;
for (int i = 0; i < num_row; i++) {
for (int j = 0; j < num_col; j++) {
printf("%d\n", a[i][j]);
}
}
}
int main(void)
{
int a[2][3] = {{1, 2, 3}, {4, 5, 6}};
int b[3][3] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
print(a, NUM_ROW(a));
print(b, NUM_ROW(b));
return 0;
}