微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何使用指针算法操作二维数组中的列和行

如何解决如何使用指针算法操作二维数组中的列和行

在过去的几天里,我熟悉了二维数组以及操作它们所涉及的指针算法

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)

这很简单,但是当访问二维数组中的元素时,内存中的数组布局是线性的,即它看起来像这样:

[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,333}},input = 0;       
      int *p = &(*(*a)),i = 0;                                                   
                                                                                  
      for (;p <= ((*a)+15); p++){                                                 
          printf("Enter 4 numbers for array %d\n: ",i);                          
          scanf("%d",&input);                                                    
          *p = input; i++;                                                        
      }                                                                           
                                                                                  
                                                                                  
      return 0;                                                                   
  } 

我想在数组中一次输入 4 个数字而不使用括号,只使用指针算法,我怎么知道何时到达数组的末尾,然后提示填写下一个数组?我如何分别处理列和行?

p.s 我已经对此进行了研究,但我在 stackoverflow 中找到的答案并没有充分回答我的问题。

解决方法

如果我理解正确,那么您需要以下内容。

#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,333}};       
int (*p)[4] = a; 
                                                                                        
for (int i = 0; i < 4; i++) {                             
    printf("Enter 4 numbers for array %d\n: ",i);                          
    scanf("%d %d %d %d",p[0],p[1],p[2],p[3]);                                                    
    p++;                                       
}    

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。