문타쿠, 공부하다.
[C언어 코딩 도장] Unit 37. 2차원 배열 사용하기 본문
37.1 2차원 배열을 선언하고 요소에 접근하기
#include <stdio.h>
int main(void)
{
int numArr[3][4] = {
{ 0, 1, 2, 3},
{10, 11, 12, 13},
{20, 21, 22, 23}
};
printf("%d\n", numArr[0][1]);
printf("%d\n", numArr[1][2]);
printf("%d\n", numArr[2][3]);
return 0;
}
37.2 2차원 배열을 초기화하기
#include <stdio.h>
int main(void)
{
int numArr[3][4] = { 0, };
printf("%d\n", numArr[0][1]);
printf("%d\n", numArr[1][2]);
printf("%d\n", numArr[2][3]);
return 0;
}
37.3 2차원 배열의 요소에 값 할당하기
#include <stdio.h>
int main(void)
{
int numArr[3][4];
numArr[0][0] = 0;
numArr[1][2] = 12;
numArr[2][3] = 23;
printf("%d\n", numArr[0][0]);
printf("%d\n", numArr[1][2]);
printf("%d\n\n", numArr[2][3]);
printf("%d\n", numArr[0][3]);
return 0;
}
- 값을 초기화 하지 않고 특정 공간에만 특정 값을 할당했기 때문에, 값을 할당하지 않은 나머지 공간에는 쓰레기 값이 담겨있다. -> 출력해보면 이상한 숫자가 나옴
#include <stdio.h>
int main(void)
{
int numArr[3][4] = { 0, };
numArr[0][0] = 0;
numArr[1][2] = 12;
numArr[2][3] = 23;
printf("%d\n", numArr[0][0]);
printf("%d\n", numArr[1][2]);
printf("%d\n\n", numArr[2][3]);
printf("%d\n", numArr[0][3]);
return 0;
}
- 만약 배열을 0으로 초기화한 후 특정 공간에 특정 값을 할당한 거라면, 특정 값을 할당하지 않은 공간에는 쓰레기 값 대신 0이 담겨져있어 출력하면 0값이 나올 것이다.
37.4 2차원 배열의 크기 구하기
#include <stdio.h>
int main(void)
{
int numArr[3][4] = {
{ 0, 1, 2, 3},
{10, 11, 12, 13},
{20, 21, 22, 23}
};
// 4바이트 공간이 3 * 4 = 12개 => 48
printf("%zd\n", sizeof(numArr));
// 0번 행은 4바이트 공간이 4개 => 16
printf("%zd\n", sizeof(numArr[0]));
// 행
int row = sizeof(numArr) / sizeof(numArr[0]);
printf("%d행 ", row);
// 열
int col = sizeof(numArr[0]) / sizeof(int);
printf("%d열", col);
return 0;
}
37.5 반복문으로 2차원 배열의 요소를 모두 출력하기
#include <stdio.h>
int main(void)
{
int numArr[3][4] = {
{ 0, 1, 2, 3},
{10, 11, 12, 13},
{20, 21, 22, 23}
};
// 행
int row = sizeof(numArr) / sizeof(numArr[0]);
printf("%d행 ", row);
// 열
int col = sizeof(numArr[0]) / sizeof(int);
printf("%d열\n", col);
for (int i = 0; i < row; i++)
{
for (int j = 0; j < col; j++)
{
printf("%d ", numArr[i][j]);
}
printf("\n");
}
return 0;
}
"역순으로 출력하기"
#include <stdio.h>
int main(void)
{
int numArr[3][4] = {
{ 0, 1, 2, 3},
{10, 11, 12, 13},
{20, 21, 22, 23}
};
// 행
int row = sizeof(numArr) / sizeof(numArr[0]);
printf("%d행 ", row);
// 열
int col = sizeof(numArr[0]) / sizeof(int);
printf("%d열\n", col);
for (int i = row - 1; i >= 0; i--)
{
for (int j = col - 1; j >= 0; j--)
{
printf("%d ", numArr[i][j]);
}
printf("\n");
}
return 0;
}
37.6 2차원 배열을 포인터에 넣기
1차원 배열은 단일 포인터에 넣을 수 있다. 그렇다면, 2차원 배열은 이중 포인터에 넣을 수 있을까?
위와 같이 2차원 배열을 이중 포인터에 넣으면 경고 발생
2차원 배열을 포인터에 담으려면 다음과 같은 특별한 방법이 필요하다.
// 열의 크기가 4인 배열을 가리키는 포인터
int (*numPtr)[4];
-> 포인터를 선언할 때 *와 포인터 이름은 괄호로 묶어준 뒤 [ ]에 열의 크기를 지정
*주의
// int형 포인터를 4개 담는 포인터 배열
int *numPtr[4];
// 배열을 가리키는 배열 포인터
int (*numPtr)[4];
int (*numPtr)[4];
#include <stdio.h>
int main(void)
{
int numArr[3][4] = {
{ 0, 1, 2, 3},
{10, 11, 12, 13},
{20, 21, 22, 23}
};
int(*numPtr)[4] = numArr;
printf("numArr : %p\n", numArr);
printf("numPtr : %p\n\n", numPtr);
printf("*numArr : %p\n", *numArr);
printf("*numPtr : %p\n\n", *numPtr);
printf("**numArr: %d\n", **numArr);
printf("**numPtr: %d\n\n\n", **numPtr);
printf("numArr[0] : %p\n", numArr[0]);
printf("*numArr[0]: %d\n\n", *numArr[0]);
printf("numArr[1] : %p\n", numArr[1]);
printf("*numArr[1]: %d\n\n", *numArr[1]);
printf("numArr[2] : %p\n", numArr[2]);
printf("*numArr[2]: %d\n\n\n", *numArr[2]);
// 배열과 포인터의 크기가 다름
printf("sizeof(numArr): %zd\n", sizeof(numArr));
printf("sizeof(numPtr): %zd\n", sizeof(numPtr));
return 0;
}
int (*numPtr)[4];
*참조
https://www.youtube.com/watch?v=wg4j5dtAP1E
'C언어 > C언어 코딩 도장' 카테고리의 다른 글
[C언어 코딩 도장] Unit 38. 포인터와 배열 응용하기 (0) | 2023.09.23 |
---|---|
[C언어 코딩 도장] Unit 37. 연습문제 및 심사문제 (0) | 2023.09.19 |
[C언어 코딩 도장] Unit 36. 연습문제 및 심사문제 (0) | 2023.09.10 |
[C언어 코딩 도장] Unit 36. 배열 사용하기 (0) | 2023.09.10 |
[C언어 코딩 도장] Unit 35. 연습문제 및 심사문제 (0) | 2023.09.10 |