我很难理解在哪里可以使用指向数组的指针,例如:char (*a)[10];
. 所以两个基本问题。
- 请给我一个简单的例子,说明如何在 C 代码中使用指向数组的指针。
- 为什么要使用它而不是将变量声明为指针,然后在该点之后递增/递减地址。
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;
}
假设您有一个返回一组字符串的数据库查询。此外,假设您知道这些字符串的长度不超过 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]);
}
每当您将具有多维数组类型的表达式传递给函数时,您都将使用指向数组的指针:
int a[10][20];
foo(a);
void foo(int (*p)[20]) // or int p[][20]
{ ... }