【问题标题】:How to manipulate columns and rows in a 2D array with pointer arithmetic如何使用指针算法操作二维数组中的列和行
【发布时间】:2021-04-07 18:37:40
【问题描述】:

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

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,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 %d\n: ", i);                          
          scanf("%d", &input);                                                    
          *p = input; i++;                                                        
      }                                                                           
                                                                                  
                                                                                  
      return 0;                                                                   
  } 

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

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

【问题讨论】:

    标签: arrays c pointers implicit-conversion pointer-arithmetic


    【解决方案1】:

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

    #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 
    

    【讨论】:

      【解决方案2】:

      您可以使用指向 4 个 ints 的数组的指针:

      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 %d\n: ", i);                          
          scanf("%d %d %d %d", p[0], p[1], p[2], p[3]);                                                    
          p++;                                       
      }    
      

      【讨论】:

      • 然后将scanf("%d %d %d %d", p[0], p[1], p[2], p[3]);替换为for (int *q = *p, j = 0; j &lt; 4; j++) scanf("%d", q++);
      猜你喜欢
      • 2021-11-13
      • 1970-01-01
      • 1970-01-01
      • 2012-03-23
      • 2016-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-08
      相关资源
      最近更新 更多