자라나라
[C언어]배열(array)[2] 본문
2차원 배열
앞서 배웠던 배열은 1차원이다.
1차원 배열은 int arr[행][열];로 선언한다.
선언 및 초기화하는 법
첫번째 방법 각 행을 {}로 묶어서 , 로 구분
아래와 같이 줄바꿈을 하지 않아도 된다.
또한, 행을 구분하지 않고 그냥 줄줄이 늘어놓는 방법도 있다.
하지만 가독성이 제일 좋은 방법은 첫번째가 될 것이다.
이제 작성한 배열을 출력해보자.
이번엔
배열 전체를 출력해보자 !
파스칼의 삼각형
파스칼의 삼각형은 양옆의 수를 더하면 그 아래의 수가 나온다. 또한 모든 행은 좌우 대칭을 이루고 있는데 이는 곱셈공식의 계수와 똑같은 모습을 보여 이항정리에 유용하게 쓰일 수 있다. 이건 오늘 중요하지 않고.
이 삼각형을 배열로 만들어 보자.
가운데 정렬이 되어있는 저 숫자들을 우선 왼쪽정렬 해보면
1
11
121
1331
14541
.
.
.
로 나타낼 수 있다. 규칙을 찾아보자.
arr[i][j]라고 본다면, j == 0, 혹은 j == i인 경우엔 1이 나타난다.
그리고, arr[i-1][j-1] 과 arr[i-1][j] 를 더하면 arr[i][j]가 나온다
이제 배열을 만들어 보자. 10x10 크기로 만들어 보겠다.
원하는 결과가 안 나왔다 .. 곰곰이 생각해보니 continue때문에 printf까지 패스되어 버렸던 것이다..
원하는 대로 출력은 됐는데 지저분하다. continue말고 else를 쓰는 게 낫겠다
배열의 크기
우선 배열의 크기를 알아보자
결과는 쉽게 이해할 수 있다.
arr는 배열 전체의 크기니까 4바이트 x 6 =24
arr[0]은 첫번째 행의 크기니까 12, a[0][0]은 첫번째행 첫번째 열의 데이터의 크기니까 4
사이즈가 아니라 주소라면?
앞에 1차원 배열에서 &arr = &arr[0] 인 것을 배웠다.
2차원 배열에서도 마찬가지이다. 0번째가 전체 배열을 대표한다
포인터배열
배열과 포인터의 관계를 알아봤다.
이번엔 '포인터배열'에 대해 알아보자
포인터배열은 말 그대로 포인터로 이루어진 배열이다. 바로 예시를 보자.
for문을 이용하면 더욱 간단히 배열을 만들 수 있다.
아래의 문제도 풀어보자 !
https://www.youtube.com/watch?v=7GDq7VU-cdw
이번엔 문자열의 포인트배열을 알아보자.
그 전에 짚고 넘어갈 것이 있다.
C언어에는 문자열의 자료형이 따로 없다고 말했었다. 대신 문자의 배열을 %s로 출력하고 스캔할 수 있었다.
자세히 설명을 하지 않았던 %s의 역할은 배열의 0번째 칸을 가리키는 포인터를 적어주기만 하면 그 뒤에 따라오는 배열을 NULL문자가 나올 때까지 읽고 출력/스캔을 해주는 것이다.
이해를 돕기 위해 아래 예시를 보자.
그런데 우리는 이제 &arr[0] == arr라는 걸 안다.
그리하여 기존에 알던 이런 형태가 된 것이다.
이 점을 숙지한 채로 문자열의 2차원 배열을 알아보자
char arr[x][y]; 가 있다면
최대 y개 미만의 문자수를 가진 문자열 x개를 갖는 배열이 되는 것이다. 이렇게 설명하니 어렵다. 바로 예를 들어보자
NULL문자 공간까지 고려해서 열의 수를 만들어야한다.
이제 2차원 문자열 을 출력해보자
이번엔 10*10 이하의 2차원 배열을 만들어 정수를 입력받고
각 행의 합을 출력해주는 함수를 만들어 보자.
정리해보자
*arr = 0 이라고 착각을 했었다. .. 주소값을 가리키는 포인터니까 결국은 주소값이 나오게 되는 것
다음으로 넘어가기 전에 배열의 이름이 나타내는 두가지를 다시 한 번 짚고 넘어가자.
첫번째는. 배열전체
두번째는 배열의 시작 주소. 즉 arr == &arr[0]
이제 아래 문제를 풀어보자. 크기를 구할 땐 &가 붙은 값으로 변환해서 계산하자
1. arr[0]= &arr[0][0] 과 같다.
즉 [0][0] 한 칸 만큼을 더하는 거니까 +4. (int는 4바이트)
2. &arr[0]은 0행 전체 크기만큼 즉 4x3 = 12 바이트를 더함
3. arr = &arr[0] 이니까 2번과 같다.
4. &arr는 arr 전체의 크기 즉 4*9 = 36 바이트를 더함
위의 문제들을 다 맞춘다면 배열에 대해 이해했다고 말할 수 있다
++
sizeof(&arr)
sizeof(&arr[0])
sizeof(&arr[0][0])
등은 무조건 4가 된다. 주소(포인터)의 크기는 무조건 4바이트
'C언어' 카테고리의 다른 글
[C언어]포인터와 배열의 크기 (0) | 2022.04.25 |
---|---|
[C언어] 배열(array)[1] 선언, 초기화 (0) | 2022.04.15 |
[C언어] 함수 (0) | 2022.04.12 |
[C언어] if else , break/continue, random, switch (0) | 2022.04.01 |
[C언어] 반복문 (0) | 2022.03.24 |