it-source

C에서 포인터로 2D 배열을 전달하는 방법은 무엇입니까?

criticalcode 2023. 6. 15. 21:55
반응형

C에서 포인터로 2D 배열을 전달하는 방법은 무엇입니까?

저는 C를 배우고 있는데 2D 배열의 포인터를 2D 배열을 인쇄하는 다른 함수로 전달하는 데 어려움을 겪고 있습니다.어떤 도움이라도 주시면 감사하겠습니다.

int main( void ){
    char array[50][50];
    int SIZE;

    ...call function to fill array... this part works.

    printarray( array, SIZE );
}

void printarray( char **array, int SIZE ){
    int i;
    int j;

    for( j = 0; j < SIZE; j++ ){
        for( i = 0; i < SIZE; i ++){
            printf( "%c ", array[j][i] );
        }
        printf( "\n" );
    }
}

char **2D 배열을 나타내지 않습니다. 포인터에 대한 포인터 배열입니다.의 정의를 변경해야 합니다.printarray2D 배열을 전달하려는 경우:

void printarray( char (*array)[50], int SIZE )

또는 동등한 값:

void printarray( char array[][50], int SIZE )

main()변수 "array"는 다음과 같이 선언됩니다.

char array[50][50];

이것은 2500바이트의 데이터입니다.언제main()의 "array"가 전달됩니다. 이는 해당 데이터의 시작 부분에 대한 포인터입니다.50개 행으로 구성될 것으로 예상되는 차트에 대한 포인터입니다.

아직 작동 중입니다.printarray()당신이 선언하는

 char **array

여기 "array"는 다음에 대한 포인터입니다.char *pointer.

@의 루커스 제안void printarray( char array[][50], int SIZE )SIZE 매개 변수가 50이어야 한다는 점에서 일반적이지 않다는 점을 제외하면 작동합니다.

아이디어: 매개 변수 배열 유형을 제거합니다(예치).printarray()

void printarray(void *array, int SIZE ){
    int i;
    int j;
    char *charArray = (char *) array;

    for( j = 0; j < SIZE; j++ ){
        for( i = 0; i < SIZE; i ++){
            printf( "%c ", charArray[j*SIZE + i] );
        }
        printf( "\n" );
    }
}

보다 우아한 솔루션은 "어레이"를 다음과 같이 만드는 것입니다.main()일렬로 늘어선 포인터

// Your original printarray()
void printarray(char **array, int SIZE ){
    int i;
    int j;
    for( j = 0; j < SIZE; j++ ){
        for( i = 0; i < SIZE; i ++){
            printf( "%c ", array[j][i] );
        }
        printf( "\n" );
    }
}

// main()
char **array;
int SIZE;
// Initialization of SIZE is not shown, but let's assume SIZE = 50;
// Allocate table
array = (char **) malloc(SIZE * sizeof(char*));
  // Note: cleaner alternative syntax
  // array = malloc(sizeof *array * SIZE);
// Allocate rows
for (int row = 0; row<SIZE; row++) {
  // Note: sizeof(char) is 1. (@Carl Norum)
  // Shown here to help show difference between this malloc() and the above one.
  array[row] = (char *) malloc(SIZE * sizeof(char));
    // Note: cleaner alternative syntax
    // array[row] = malloc(sizeof(**array) * SIZE);
  }
// Initialize each element.
for (int row = 0; row<SIZE; row++) {
  for (int col = 0; col<SIZE; col++) {
    array[row][col] = 'a';  // or whatever value you want
  }
}
// Print it
printarray(array, SIZE);
...

C99는 동적 크기의 어레이를 지원하므로 2-dim 어레이를 통과하는 데 다음 스타일이 더 편리합니다.

void printarray( void *array0, int SIZE ){
    char (*array)[SIZE] = array0;
    int i;
    int j;
    for( j = 0; j < SIZE; j++ ){
        for( i = 0; i < SIZE; i ++){
            printf( "%c ", array[j][i] );
        }
        printf( "\n" );
    }
}

여기에 제가 찾던 답이 없어서, 저는 문제에 대한 간단한 해결책을 게시합니다.

#include <iostream>

using namespace std;

void example(int* mat, int dim0, int dim1){
    
    for(int i = 0; i < dim0; ++i) {
         for(int j = 0; j < dim1; ++j) {
             auto cur_index = i * dim1 + j;
            cout<< *(mat + cur_index) << endl;
        }
    }
}

int main()
{
    const int dim0 = 3;
    const int dim1 = 2;

    int mat[dim0][dim1];
    
    for(int i = 0; i < dim0; ++i) {
         for(int j = 0; j < dim1; ++j) {
            mat[i][j] = i * dim1 + j;
        }
    }
    
    example(&(mat[0][0]), dim0, dim1);
    return 0;
}

이중 포인터를 사용하여 2D 배열을 쉽게 전달할 수 있습니다.

  void printarray( char **array, int n)
  {
     int i, j;
     for(i=0; i<n; i++ )
     {
         for(j=0; j<n; j++)
         {
            printf("%c ", array[i][j] );
         }
        printf( "\n" );
     }
  }

  int main()
  {
      int n = 2;
      int i, j;

      char **array = (char **) malloc(n * sizeof(char*));

      for (i=0; i<n; i++) 
      {
        array[i] = (char *) malloc(n* sizeof(char));
      }

     for (i=0; i<n; i++)
     {
       for (j=0; j<n; j++)
       {
           scanf("%c ", &array[i][j]);
       }
     }

     printarray(array, n);

     return 0;
  }

전체 코드 : Ideone

언급URL : https://stackoverflow.com/questions/16724368/how-to-pass-a-2d-array-by-pointer-in-c

반응형