c-如何使用指针算术操作2D数组中的列和行



在过去的几天里,我已经熟悉了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++;                                       
}