211101, C언어 입문 day 13-1

Min Hyeok·2021년 11월 1일
0

C언어 개념 익히기

목록 보기
16/19

세상에.. 벌써 11월이다.

이걸 믿어야하냐 말아야하냐.

전역한지 3개월이 되어가는데, 이러다가 개강까지도 금방이다.

열심히 공부하자.

17장, 다차원 포인터

17-1

13장에서 배웠던 "포인터"를 조금 더 심층적으로 공부한다 생각하자.

우리가 배열을 공부 할 때, 흔히 접한 배열은 arr[8]과 같은 1차원 배열이다. 그런데, 우리는 공부 하면서 arr[4][3] 과 같은 2차원 배열도 접했었다. 이런 식의 "차원" 개념이 포인터에도 있다. 그걸 공부하려고 한다.

다차원 포인터. 말 그대로 간접적으로 여러번 가리키는 포인터다. 포인터가 포인터를 가리킨다고 생각하면 된다.

만약 내가 부산을 간다 치자. 부산 맛집을 찾아보고 가려고 하는데, 부산 토박이 친구 "민"과 "혁"이 있다. 내가 처음으로 "민"한테 가서 물어봤는데, "민"이란 친구가

맛집은 "혁"이가 잘 알아!

라고 해서 "혁"이를 찾아갔는데, 그 "혁"이가 "민"이의 말 대로 맛집을 알려줬다.

그러면 "민"이가 2차원 포인터, "혁"이가 1차원 포인터, 알아낸 맛집의 주소가 "0차원, 즉 포인터가 가리키는 대상"이 되는거다.

17-2

그러면 다차원 포인터를 사용하는 방법에 대해 알아보겠다. 우선 가장 많이 사용한다는 2차원 포인터부터.

일단, * 한개당 1차원이라 생각하면 편하다. 만약

*p

라면 1차원 포인터일 것이고,

**pp

라면 2차원 포인터일 것이다.

2차원 포인터 변수를 set을 한 뒤

*pp //1번
**pp //2번

말로 설명하면 직관적이지 않아서 그림을 얹어보면

요렇게. 1번을 사용해주면 변수 pp에 저장되어 있는 주소(106번지)로 이동해서 값을 읽거나 저장할 수 있고, 2번을 사용하면 포인터 pp가 가리키는 대상에 저장된 주소값(110번지)을 대상으로 사용한다.

이 구조를 대충 코드로 짜준다면

short **pp, *p, final_data = 7;
p = &data;
pp = &p;
**pp = 4;

요런식으로 건드리면 2차원 포인터 구조를 응용해서 데이터를 건드려 줄 수 있다.

그리고 1차원 포인터처럼, 2차원 포인터도 가리키는 대상을 동적 할당을 할 수 있다.

short **pp, data = 3;
pp = (short **)malloc(sizeof(short *));
*pp = &data;
**pp = 6;

그림 위의 코드를 그림으로 나타내주면 바로 위의 그림처럼 되는거다. ( short * )형식의 포인터를 동적으로 할당 해서, 그 주소값을 2차원 포인터인 pp 에 저장되는 형태다. 그냥 "1차원 포인터 한 개를 동적 할당 했다" 라고 말할 수 있는 구조가 되는거다.

물론, 세번째 동그라미인 110번지 부분을 동적할당 하라면, 그것도 못할 건 없다.

short **pp, data = 3;
pp = (short **) malloc(sizeof(short *));
*pp = (short *) malloc(sizeof(short));
free(*pp);
free(pp);

이렇게 해주면 된다. 그러면 두 번째 동그라미도 동적할당, 세 번째 동그라미도 동적할당이 되는거다.

단, 무조건 세 번째 상자 메모리를 해제하고 두 번째 상자 메모리르 해제해야 한다. 이 구조를 써먹을꺼면 까먹지 말고 꼭 꼭 기억하자.

"근데, 이 2차원 포인터 동적 할당은 복잡한데 굳이 왜 해줘요?"

이런게 안 됐다. 배열 요소의 개수를 상수로만 할당할 수 있어서, 변수를 집어넣을 수가 없었다.
만약 내가 어떤 프로그램을 scanf로 입력을 받아서 사용자 임의로 어떤 요소의 개수를 설정해야한다고 치면, 저렇게 바로 배열을 만들어 버릴 수 없었다. 쓸모없이 오지게 크게 배열 만들어서 메모리 손실을 만들어버릴 수도 없고.
이런 단점을 없애려고 동적 메모리 할당을 써주는 것이다. 알간? ㅋㅋ

  • 211028, day 12-2 일부 발췌

이거랑 똑같은 맥락이다.

2차원 배열을 써준다면 행 개수 or 열 개수가 바뀌면 다시 컴파일을 해야한다. 그런데 이렇게 동적 메모리 할당을 써먹어 준다? 그러면 굳이 컴파일이 필요없다.

*pp = (short *)malloc(갯수*sizeof(short));

라거나,

short **pp = (short **) malloc(갯수*sizeof(short *));

와 같은 식으로 써줄 수 있거든.

알아두자!

오늘은 이정도만 복습해놔야겠다.

오늘은 여기까지,

p.s. 이제 C언어 책도 거의 끝나서, 이번주부터 C++ 학습과 함께 자료구조 공부를 시작할 예정이다. 나 자신 화이팅.

0개의 댓글