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'
.
를 들어, 「」를 사용할 수 는,NAN
Sentinel 값으로 지정됩니다.실제 데이터는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
'programing' 카테고리의 다른 글
리프레시 시 Vuejs 루트 리다이렉트 (0) | 2022.07.13 |
---|---|
Maven 저장소에서 Oracle JDBC 드라이버 찾기 (0) | 2022.07.08 |
Java에서의 CharSequence VS 문자열? (0) | 2022.07.08 |
Vue 클래스 구성 요소에서 필터를 정의하려면 어떻게 해야 합니까? (0) | 2022.07.08 |
정적 라이브러리와 공유 라이브러리의 차이점 (0) | 2022.07.08 |