배열은 포인터가 아닙니다!
그들은 단지 자동으로 첫 번째 요소에 대한 포인터로 강등됩니다. 우리가 int arr[2]
이있는 경우 예를 들어
은 다음 arr
메모리에 두 개의 연속하는 int를 나타냅니다, 그리고 첫 번째 요소에 대한 포인터로 강등됩니다 (그래서 int*
를 입력했다) :
arr ---+ +--- arr + 1
v v
memory: ... | arr[0] | arr[1] | ...
그러나 우리가 int arr[2][2]
인 경우 arr
은 메모리에서 네 개의 연속 int를 나타내며 첫 번째 요소에 대한 포인터로 강등됩니다 (따라서 형식은,463,210) 한편, 우리는 명확성을 위해 추가 int *(arr[2])
괄호()를 가지고 있다면, arr
메모리에 두 개의 연속 INT 포인터 배열을 나타내고,이 강등 도착
arr ---+ arr + 1 ---+
v v
memory: ... | arr[0][0] | arr[0][1] | arr[1][0] | arr[1][1] | ...
첫 번째 요소의 포인터 (그래서 갖는다 int**
입력)
arr ---+ +--- arr + 1
v v
memory: ... | arr[0] | arr[1] | ...
| |
... -+ +- ...
,174,
print2darr3은 세 번째 예제와 비슷하지만 두 번째 예제와 비슷한 것을 제공합니다.
#include <stdio.h>
void print2darr3(int rows, int columns, int *arr) {
int i,j;
for (i = 0; i < rows ; i++) {
for (j = 0; j < columns; j++) {
printf("%d ", arr[i * columns + j]);
}
printf("\n");
}
}
int main(void) {
int linear_array[3][3] = {
{10,20,30},
{40,50,60},
{70,80,90},
};
print2darr3(3, 3, (int*)linear_array);
return 0;
}
또는 :
#include <stdio.h>
void print2darr3(int rows, int columns, int **arr) {
int i,j;
for (i = 0; i < rows ; i++) {
for (j = 0; j < columns; j++) {
printf("%d ", arr[i][j]);
}
printf("\n");
}
}
int main(void) {
int linear_array[3][3] = {
{10,20,30},
{40,50,60},
{70,80,90},
};
int *pointer_array[3] = {
(int*)(linear_array + 0),
(int*)(linear_array + 1),
(int*)(linear_array + 2),
};
print2darr3(3, 3, pointer_array);
return 0;
}
또한
이, C (그러나 C++에서)에서 당신이 할 수있는
당신은 어느 길을 갈 수 있습니다 :
#include <stdio.h>
void print2darr3(int rows, int columns, int arr[rows][columns]) {
int i,j;
for (i = 0; i < rows ; i++) {
for (j = 0; j < columns; j++) {
printf("%d ", arr[i][j]);
}
printf("\n");
}
}
int main(void) {
int linear_array[3][3] = {
{10,20,30},
{40,50,60},
{70,80,90},
};
print2darr3(3, 3, linear_array);
return 0;
}
C 스타일 2 차원 배열이 포인터를 가리키는 포인터가 아니기 때문에 이런 식으로 작동하지 않습니다. –
코드에 컴파일러 경고 메시지가 표시되지 않습니까? – mafso
'sizeof (int) == sizeof (int *)'일 때 작동합니다. 아마, 그것은 시스템이 아닌 경우에는 작동하지 않습니다. – BLUEPIXY