2차원 어레이를 함수로 올바르게 변환하는 방법
저는 2차원 배열을 가지고 있으며, 특정 작업을 수행하는 함수에 전달하고 있습니다.올바른 방법을 알고 싶어요...
#define numRows 3
#define numCols 7
#define TotalNum (numRows*numCols)
int arr[numRows][numCols] = {{0,1,2,3,4,5,6}, {7,8,9,10,11,12,13},{14,15,16,17,18,19,20}};
void display(int **p)
{
printf("\n");
for (int i = 0; i< numRows;i++)
{
for ( int j = 0;j< numCols;j++)
{
printf("%i\t",p[i][j]);
}
printf("\n");
}
}
int main() {
display(arr);
}
에러 메세지가 표시됩니다.
'display': cannot convert parameter1 from 'int' to 'int*'
이것이 2차원 배열을 함수로 전달하는 올바른 방법입니까?그렇지 않은 경우 올바른 방법은 무엇입니까?
다음과 같이 기능을 선언해야 합니다.
void display(int p[][numCols])
이 C FAQ에서는 그 이유를 자세히 설명합니다.여기서 중요한 것은 어레이가 포인터로 한 번 붕괴되면 재귀적으로 발생하지 않는다는 것입니다.배열은 포인터에 대한 포인터가 아니라 배열에 대한 포인터로 소멸한다.
이것을 하는 방법에는 몇 가지, 경우에 따라서는 동등한 방법이 있습니다.레cfcf ★★★★★★★★★★★★★★★★★★★★」 method_c()
을 사용하다 method_b()
또는 어레이 배열(cf)에 대한 포인터를 사용합니다. method_a()
method_b()
단일 포인터를 사용하면 표준 어레이 인덱싱을 사용하는 것이 쉽지 않기 때문에 포인터 계산을 사용하는 것이 조금 더 어렵습니다. method_a()
★★★★★★★★★★★★★★★★★」method_c()
는 컴파일 중에 포인터에 대해 어레이가 비연속적으로 붕괴하기 때문에 기본적으로 동일합니다.여기 세 가지 방법을 모두 보여주는 작은 프로그램이 있습니다. '아, 아, 아, 아, 아, 아, 아, 아, 아, 맞다'를 초기화합니다.2x4
- array - 레 -arr
간단한 포루프 방식으로 인쇄합니다.뭇매를 맞다
arr:
0 1 2 3
0 1 2 3
아, 네, 네, 네, 네. method_a()
1을 .method_b()
와 2를 method_c()
3번입니다. 콜 합니다.arr
기능이 제대로 작동했다면 출력에서 쉽게 확인할 수 있습니다.이며 2개의 할 수 .ROW
★★★★★★★★★★★★★★★★★」COL
마지막으로 한 마디만 더 하자면method_c()
이후부터 존재하는 가변 길이 배열에 의존합니다.C99
.
#include <stdio.h>
#include <stdlib.h>
#define ROW 2
#define COL 4
void method_a(int m, int n, int (*ptr_arr)[n]);
void method_b(int m, int n, int *ptr_arr);
void method_c(int m, int n, int arr[][n]);
int main(int argc, char *argv[]) {
int arr[ROW][COL];
int i;
int j;
for(i = 0; i < ROW; i++) {
for(j = 0; j < COL; j++) {
arr[i][j] = j;
}
}
printf("Original array:\n");
for (i = 0; i < ROW; i++) {
for(j = 0; j < COL; j++) {
printf("%d\t", arr[i][j]);
}
printf("\n");
}
printf("\n\n");
method_a(ROW, COL, arr);
printf("method_a() array:\n");
for (i = 0; i < ROW; i++) {
for(j = 0; j < COL; j++) {
printf("%d\t", arr[i][j]);
}
printf("\n");
}
printf("\n\n");
printf("method_b() array:\n");
method_b(ROW, COL, (int *)arr);
for (i = 0; i < ROW; i++) {
for(j = 0; j < COL; j++) {
printf("%d\t", arr[i][j]);
}
printf("\n");
}
printf("\n\n");
method_c(ROW, COL, arr);
printf("method_c() array:\n");
for (i = 0; i < ROW; i++) {
for(j = 0; j < COL; j++) {
printf("%d\t", arr[i][j]);
}
printf("\n");
}
printf("\n\n");
return EXIT_SUCCESS;
}
void method_a(int m, int n, int (*ptr_arr)[n])
{
int i, j;
for (i = 0; i < m; i++)
{
for (j = 0; j < n; j++)
{
ptr_arr[i][j] = j + 1;
}
}
}
void method_b(int m, int n, int *ptr_arr)
{
int i, j;
for (i = 0; i < m; i++)
{
for (j = 0; j < n; j++)
{
/* We need to use pointer arithmetic when indexing. */
*((ptr_arr + i * n) + j) = j + 2;
}
}
/* The whole function could have also been defined a bit different by taking
* the i index out of the pointer arithmetic. n alone will then provide our
* correct offset to the right. This may be a bit easier to understand. Our
* for-loop would then look like this:
* for (i = 0; i < m; i++)
* {
* for (j = 0; j < n; j++)
* {
* *((ptr_arr + n) + j) = j + 2;
* }
* ptr_arr++;
* }*/
}
void method_c(int m, int n, int arr[][n])
{
int i, j;
for (i = 0; i < m; i++)
{
for (j = 0; j < n; j++)
{
arr[i][j] = j + 3;
}
}
}
당신은 잘못된 방법으로 하고 있어요.2-d 어레이는 포인터를 사용하여 어레이에 전달하거나 어레이를 전달하거나 단일 포인터를 통해 전달할 수 있습니다.
#define numRows 3
#define numCols 7
void display(int (*p)[numcols],int numRows,int numCols)//First method//
void display(int *p,int numRows,int numCols) //Second Method//
void display(int numRows,int numCols,int p[][numCols]) //Third Method
{
printf("\n");
for (int i = 0; i < numRows;i++)
{
for ( int j = 0; j < numCols;j++)
{
printf("%i\t",p[i][j]);
}
printf("\n");
}
}
int main() {
display(arr,numRows,numCols);
}
의 경우와) 컴파일할의 치수를 알고 '', '', 쓰면 됩니다.void display(int p[][numCols])
.
: : 때 번째 있을 입니다.배열을 함수에 전달하면 실제로 첫 번째 멤버에게 포인터를 전달한다는 것을 알고 있을 것입니다.C 언어로 2D 어레이는 어레이의 배열에 불과합니다.따라서 함수를 2D 배열의 첫 번째 하위 배열에 포인터로 전달해야 합니다. 거예요.int (*p)[numCols]
(즉, p는 ints 배열에 대한 포인터입니다).함수 선언에는 "바로 가기"가 있습니다.p[]
, 그것은 정확히 같은 것을 의미합니다.(*p)
(단, 하나의 변수뿐만 아니라 배열의 선두에 포인터를 전달한다는 것을 독자에게 알립니다.)
간단히 선언하다
void display(int (*p)[numCols][numRows]);
이쪽입니다p
포인터는 필요한 모든 정보를 전달하며 반복하지 않고 모든 차원을 추출할 수 있습니다.numCols
그리고.numRows
몇 번이고.
void display(int (*p)[numCols][numRows])
{
size_t i, j;
printf("sizeof array=%zu\n", sizeof *p);
printf("sizeof array[]=%zu\n", sizeof **p);
printf("sizeof array[][]=%zu\n", sizeof ***p);
size_t dim_y = sizeof *p / sizeof **p;
printf("dim_y = %zu\n", dim_y);
size_t dim_x = sizeof **p / sizeof ***p;
printf("dim_x = %zu\n", dim_x);
for(i=0; i<dim_y; i++) {
puts("");
for(j=0; j<dim_x; j++)
printf(" %6d", (*p)[i][j]);
}
}
typedefs를 사용하면 특히 흥미롭습니다(btw는 좋아하지 않습니다).
typedef int matrix[5][6];
이 경우 함수의 서명에는 치수가 표시되지 않지만 함수의 치수에 대한 올바른 값은 여전히 유지됩니다.
표시방식의 시그니처는 다음과 같이 변경할 수 있습니다.
void display(int (*p)[numCols])
여기서,p
는 2D 배열의 행에 대한 포인터입니다.포인터는 배열의 열 수만 알면 됩니다.
실제로 포인터는 각 행의 크기를 알아야 합니다.이것은 포인터 산술에 매우 중요합니다.따라서 포인터를 늘릴 때 포인터는 다음 행을 가리켜야 합니다.
여기를 참고해 주세요.p
는 일반 정수 포인터가 아닙니다.메모리 크기를 나타내는 정수 포인터입니다.integer_size x columns
.
기본적으로 아무것도 변경할 필요가 없습니다. display(arr)
괜찮아요.
언급URL : https://stackoverflow.com/questions/9446707/correct-way-of-passing-2-dimensional-array-into-a-function
'programing' 카테고리의 다른 글
OpenGL에서 glOrtho()를 사용하는 방법 (0) | 2022.07.20 |
---|---|
Java에서 C++ 'friend' 개념을 시뮬레이트할 수 있는 방법이 있나요? (0) | 2022.07.20 |
문자열 리터럴:그들은 어디로 갑니까? (0) | 2022.07.17 |
Vuejs 단일 파일 컴포넌트를 컴파일하는 방법 (0) | 2022.07.17 |
Vuetify v-btn 클릭 이벤트 (0) | 2022.07.17 |