Notice
Recent Posts
Recent Comments
Link
«   2025/07   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
Archives
Today
Total
관리 메뉴

자라나라

[C언어]배열(array)[2] 본문

C언어

[C언어]배열(array)[2]

자랄수있다 2022. 5. 8. 20:43

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차원 배열을 만들어 정수를 입력받고

각 행의 합을 출력해주는 함수를 만들어 보자.

 

 

 

정리해보자

https://www.inflearn.com/course/c%EC%96%B8%EC%96%B4-%EB%91%90%EB%93%A4%EB%82%99%EC%84%9C/lecture/2800?tab=curriculum

*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