programing

C에서 다차원 배열을 함수 인수로 전달

copyandpastes 2022. 7. 8. 00:20
반응형

C에서 다차원 배열을 함수 인수로 전달

C어레이의 치수가 어떻게 될지 모르는 경우 다차원 어레이를 단일 인수로 함수전달할 수 있습니까?

또한 다차원 배열에는 문자열 이외의 유형이 포함될 수 있습니다.

다음과 같이 함수를 선언할 수 있습니다.

f(int size, int data[][size]) {...}

그러면 컴파일러가 모든 포인터 계산을 수행합니다.

치수 사이즈는 어레이 자체보다 먼저 표시되어야 합니다.

GNU C는 인수 선언 전송을 허용합니다(배열 후에 치수를 전달해야 하는 경우).

f(int size; int data[][size], int size) {...}

첫 번째 치수는 인수로도 전달될 수 있지만 C 컴파일러에서는 사용할 수 없습니다(연산자 크기에서도 인수로 전달된 배열에 적용되면 항상 첫 번째 요소에 대한 포인터로서 처리됩니다).

배열 치수를 별도의 매개 변수로 사용하여 첫 번째 요소에 명시적 포인터를 전달합니다.예를 들어 int의 임의의 크기의 2-d 어레이를 처리하려면:

void func_2d(int *p, size_t M, size_t N)
{
  size_t i, j;
  ...
  p[i*N+j] = ...;
}

라고 불릴 것이다.

...
int arr1[10][20];
int arr2[5][80];
...
func_2d(&arr1[0][0], 10, 20);
func_2d(&arr2[0][0], 5, 80);

고차원 어레이에도 동일한 원리가 적용됩니다.

func_3d(int *p, size_t X, size_t Y, size_t Z)
{
  size_t i, j, k;
  ...
  p[i*Y*Z+j*Z+k] = ...;
  ...
}
...
arr2[10][20][30];
...
func_3d(&arr[0][0][0], 10, 20, 30);

이 작업은 모든 데이터 유형에서 수행할 수 있습니다.포인터 포인터로 하면 됩니다.

typedef struct {
  int myint;
  char* mystring;
} data;

data** array;

그러나 변수를 malloc해야 한다는 것을 잊지 마십시오. 그리고 이것은 약간 복잡합니다.

//initialize
int x,y,w,h;
w = 10; //width of array
h = 20; //height of array

//malloc the 'y' dimension
array = malloc(sizeof(data*) * h);

//iterate over 'y' dimension
for(y=0;y<h;y++){
  //malloc the 'x' dimension
  array[y] = malloc(sizeof(data) * w);

  //iterate over the 'x' dimension
  for(x=0;x<w;x++){
    //malloc the string in the data structure
    array[y][x].mystring = malloc(50); //50 chars

    //initialize
    array[y][x].myint = 6;
    strcpy(array[y][x].mystring, "w00t");
  }
}

구조의 할당을 해제하는 코드는 비슷해 보입니다.malloose한 모든 것에 대해 free()를 호출하는 것을 잊지 마십시오(또한 강력한 어플리케이션에서는 malloc()의 반환을 확인해야 합니다).

이제 이 값을 함수에 전달한다고 가정해 보겠습니다.데이터 구조의 포인터에 대한 포인터가 아닌 데이터 구조에 대한 조작을 수행할 수 있기 때문에 이중 포인터를 계속 사용할 수 있습니다.

int whatsMyInt(data** arrayPtr, int x, int y){
  return arrayPtr[y][x].myint;
}

이 함수를 호출하는 방법:

printf("My int is %d.\n", whatsMyInt(array, 2, 4));

출력:

My int is 6.

C에서는 어레이의 치수가 어떻게 될지 모르는 경우 다차원 어레이를 단일 인수로 함수에 전달할 수 있습니까?

아니요.

"single argument(단일 인수)"가 어레이 치수를 통과하지 않고 어레이만 통과시키는 경우 아니요.적어도 진정한 다차원 배열에는 해당되지 않습니다.

차원을 배열과 함께 구조체에 넣고 "단일 인수"를 전달한다고 주장할 수 있지만, 실제로는 여러 값을 단일 컨테이너에 넣고 해당 컨테이너를 "하나의 인수"라고 부르는 것입니다.

치수 자체와 어레이를 다음과 같이 전달하면 알려진 유형과 수, 그러나 크기를 알 수 없는 어레이를 전달할 수 있습니다.

void print2dIntArray( size_t x, size_t y, int array[ x ][ y ] )
{
    for ( size_t ii = 0, ii < x; ii++ )
    {
        char *sep = "";
        for ( size_t jj = 0; jj < y; jj++ )
        {
            printf( "%s%d", sep, array[ ii ][ jj ] );
            sep = ", ";
        }
        printf( "\n" );
    }
}

이 함수를 다음과 같이 부릅니다.

int a[ 4 ][ 5 ];
int b[ 255 ][ 16 ];

...

print2dIntArray( 4, 5, a );

....

printt2dIntArray( 255, 16, b );

3차원 를 들어 3차원 배열.struct pixel:

void print3dPixelArray( size_t x, size_t y, size_t z, struct pixel pixelArray[ x ][ y ][ z ] )
{
    ...
}

1차원의double 스위칭:

void print1dDoubleArray( size_t x, double doubleArray[ x ] )
{
    ...
}

그렇지만.....

「은의 「 배열」 「포터 배열」을 건네줄 수 .X "다차원 배열"이 "인가 많은 X 타입 「1」의할 수 .X.

를 들면, 「」는,char **argv「」에 되는 값main()입니다.char의 첫 .char * with로 a 로로 a a a로 끝납니다.NULL 값,각 sentinel 값, " ", "char가 .char * with로 a 로로 a a a로 끝납니다.NUL '''」'\0'.

를 들어, 「」를 사용할 수 는,NANSentinel 값으로 지정됩니다.실제 데이터는NAN , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , .double **음음음같 뭇매하다

void printDoubles( double **notAnArray )
{
    while ( *notAnArray )
    {
        char *sep = "";
        for ( size_t ii = 0;  ( *notAnArray )[ ii ] != NAN; ii++ )
        {
            printf( "%s%f", sep, ( *notAnArray )[ ii ] );
            sep = ", ";
        }

        notAnArray++;
    }
}
int matmax(int **p, int dim) // p- matrix , dim- dimension of the matrix 
{
    return p[0][0];  
}

int main()
{
   int *u[5]; // will be a 5x5 matrix

   for(int i = 0; i < 5; i++)
       u[i] = new int[5];

   u[0][0] = 1; // initialize u[0][0] - not mandatory

   // put data in u[][]

   printf("%d", matmax(u, 0)); //call to function
   getche(); // just to see the result
}

언급URL : https://stackoverflow.com/questions/4051/passing-multidimensional-arrays-as-function-arguments-in-c

반응형