교재 : 열혈 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 포인터
함수 포인터라는 개념은 생소한데, 그냥 말 그대로 함수를 가리키는 포인터인 것 같다. 선언할 때 어떻게 선언하는 지 정도 봐두면 될 듯.
아 근데 함수 포인터에는 왠지 모르게 쓰레기 값이 들어가있는데, 막상 호출은 잘만 된다. 뭐지.
'C' 카테고리의 다른 글
여러 분은 이 답이 뭐라고 생각하십니까? 알면 상위 1% 코딩 실력을 가진 사람 (3) | 2022.07.22 |
---|---|
[C언어 문법] part04 C언어의 깊은 이해 (0) | 2021.12.11 |
[C언어 문법] 20장 도전 프로그래밍 3 (0) | 2021.12.11 |
[열혈 C 프로그래밍] 도전! 프로그래밍2 (1) | 2021.10.21 |
[열혈 C 프로그래밍] 도전! 프로그래밍1 (0) | 2021.10.21 |