본문 바로가기

C

[C언어 문법] part03 포인터와 배열의 완성

728x90

교재 : 열혈 C 프로그래밍

 

 C언어 시험 공부를 1도 안 해서 코드 위주로 살펴 보았다. 

 


16장 다차원 배열

 비교적 쉬운 파트다. 3차원 배열은 자주 사용되는 부분은 아니므로 자.체.생.략.

 

1. 다차원 배열 모양 

 다차원 배열의 행과 열을 변환할 때 주의해야 한다. 

 

2. 당연한 말이지만 2차원 배열에서 배열의 크기를 알려주지 않고 초기화할 경우, 행이든 열이든 둘 중 하나는 써야 한다. 

 


17장 포인터의 포인터

 자료구조 시간에 죽어라 썼던 이중 포인터. 이걸 처음 봤을 때 도대체 이걸 왜 쓰지;; 라고 생각했던 때가 새록새록 떠오른다. 

 

1. 기본 개념

num 3.14
ptr num의 주소값
*ptr 3.14
dptr ptr의 주소값
*dptr num의 주소
**dptr 3.14

 

이중 포인터 개념이 헷갈릴 수도 있는데 이것만 보면 이해 쌉가능~

 

 

2. call-by-reference

- fail

 

 위 코드에서는 당연하게도 값이 swap되지 않는다. 왜냐고? 그림에서 파란색은 함수 부분 변수로서 함수가 종료되면 사라진다. 즉 p1과 p2는 함수 부분에서 서로 바뀐 뒤 끝나기 때문에 값의 swap이 되지 않는다. 

 

 

- success

 

 이중 포인터를 사용해서 포인터가 가리키는 값을 변경해주면 swap이 됩니다~

 

3. 이중 포인터 변수 활용 ★

-fail

 

 

 내가 짠 코드인데 코드가 ㅈ 됐다. 여유롭게 코딩할 처지가 아니어서 답안지를 보겠다. 

 

- success

 


18장 다차원 배열과 포인터의 관계

 

 여기서부터 헤매기 시작~

 

1. 2차원 배열 이름의 포인터 형

 

배열이 포인터 형이라는 건 알았는데, 2차원 배열의 포인터를 만드는 방법은 잘 몰랐던 감자.

int arr[3][4];
int (*ptr)[4];  //배열 포인터

 

일단 배열 arr이 가리키는 포인터는 int형이고, 포인터 연산시 sizeof(int)*4 크기 단위로 값이 증가 및 감소하는 포인터 형이다.  그래서 포인터 선언을 그냥 하면 안 되고, 크기 단위를 뒤에 붙여 줘야 한다!

 

 

 

2. 배열 포인터 vs 포인터 배열

 

 말 장난도 아니고 포인터 배열과 배열 포인터. 뭔 개소리야..  대충 앞에 있는 말이 주가 되는거고 소괄호를 통해서 구분한다고 생각하면 될 것 같다. 

 

이게 포인터 배열 : 포인터들이 여러 개 저장되어 있는 배열

이게 배열 포인터 : 배열을 가리키는 포인터(소괄호가 들어가여~)

 

3. 2차원 배열을 함수 인자로 보내는 법

 

 함수에서 배열을 매개변수로 받는 방법은 두 가지가 있다. 

int (*arr)[4]; //== int* (arr)[4]
int arr[][4];

 

 타이핑 잘못 해서 *이 소괄호 밖으로 나왔는데 잘 출력되는 거 보니까 별 상관 없는 듯 하다. 

 

4. arr[i] == *(arr+i)

 

5. 이건 문젠데 배열 포인터를 가리키는 이중 포인터를 선언하는 거다. 풀긴 했는데 까먹을 까바 킵.

int* arr1[5];
int* arr2[3][5];

int** ptr1 = arr1;
int* (*ptr2)[5] = arr2;

 

6. 제일 헷갈렸던 문제

 

 이 코드를 주고 출력값이 뭐가 나올까 예측하는 문제. 답은 뭘까 ㄷㄱㄷㄱㄷㄱ~~

 

 아래 그림을 참고해서 보길 바란다

arr[1][0] [1][0]의 요소값
*(arr[2]+1) [2][1]의 요소값, 요기서 3행을 가리키는 건가 헷갈렸음
(*(arr+2))[0] [2][0]의 요소값, 
**arr [0][0]의 요소값

 

 


19장 함수 포인터와 void 포인터

 

 함수 포인터라는 개념은 생소한데, 그냥 말 그대로 함수를 가리키는 포인터인 것 같다. 선언할 때 어떻게 선언하는 지 정도 봐두면 될 듯. 

 

 

 아 근데 함수 포인터에는 왠지 모르게 쓰레기 값이 들어가있는데, 막상 호출은 잘만 된다. 뭐지.