在过去的几天里,我已经熟悉了2D数组和操作它们所涉及的指针算法,例如
int array[2][2] = {{1,2},{3,4}}, *p = (*a);
// to access the value of the ith element in the array
// you can do *(p+i)
这很简单,但当访问2D阵列中的元素时,存储器中的阵列布局是线性的,即它看起来像这样:
[1] [2] [3] [4]
0x4 0x8 0x12 0x16
我的问题是,如何使用C中引用和访问数组的这种方式来操作行和列?
例如,我有以下程序:
#include <stdio.h>
int main(void){
int a[4][4] = {{1,2,3,4},{5,6,7,8},{1,2,3,4},{5,6,7,333}}, input = 0;
int *p = &(*(*a)), i = 0;
for (;p <= ((*a)+15); p++){
printf("Enter 4 numbers for array %dn: ", i);
scanf("%d", &input);
*p = input; i++;
}
return 0;
}
我想在数组中一次输入4个数字,而不使用括号,只使用指针算术,我如何知道何时到达数组的末尾,然后提示填写下一个数组?如何分别处理列和行?
附言:我已经对此做了研究,但我在斯塔克沃斯找到的答案并不能充分回答我的问题。
如果我理解正确,那么您需要以下内容。
#include <stdio.h>
int main(void)
{
enum { N = 4 };
int a[N][N];
for ( int ( *p )[N] = a; p != a + N; ++p )
{
printf( "Enter %d numbers for array %td: ", N, p - a );
for ( int *q = *p; q != *p + N; ++q )
{
scanf( "%d", q );
}
}
for ( int ( *p )[N] = a; p != a + N; ++p )
{
for ( int *q = *p; q != *p + N; ++q )
{
printf( "%d ", *q );
}
putchar( 'n' );
}
return 0;
}
程序输出可能看起来像
Enter 4 numbers for array 0: 1 2 3 4
Enter 4 numbers for array 1: 5 6 7 8
Enter 4 numbers for array 2: 9 8 7 6
Enter 4 numbers for array 3: 5 4 3 2
1 2 3 4
5 6 7 8
9 8 7 6
5 4 3 2
您可以使用指向4个int
的数组的指针:
int a[4][4] = {{1,2,3,4},{5,6,7,8},{1,2,3,4},{5,6,7,333}};
int (*p)[4] = a;
for (int i = 0; i < 4; i++) {
printf("Enter 4 numbers for array %dn: ", i);
scanf("%d %d %d %d", p[0], p[1], p[2], p[3]);
p++;
}