본문 바로가기

Language/C

C기반의 배열과 포인터, 그리고 함수 2

 

'윤성우의 열혈C프로그래밍'을 보고 작성한 글입니다.

 

 

✔chapter 16.  다차원배열

// 이렇게 다차원 배열을 정의할 수 있다.
int arr[열의개수][행의개수];

2차원 배열은 for문을 중첩시켜 값에 접근하는 것이 일반적이고 쉬운 방법이다.

 

2차원 배열도 메모리상에는 1차원의 형태로 존재한다.

다음 행으로 넘어갈 때는, 열의 개수와 형의 개수를 곱한만큼 늘어난다

int arr [2][3];
cout << sizeof(arr[i]); // int형의 크기인 4와 열의 개수인 2가 곱해져 6이 출력됨

 

✔chapter. 17 포인터의 포인터

// 더블포인터 정의 방법
int num = 1;
int *ptr = &num;
int **dptr = &ptr;

이중 포인터와 더블 포인터라고도 부른다.

 

더블 포인터는 함수 내에서 함수 외부에 선언된 변수에 접근하는 방법을 제시해준다. 아래 예시를 보자.

num을 가리키는 포인터 ptr과, 이를 매개변수로 받아 ptr의 값을 바꾸는 함수를 작성한다고 했을때,

swap 함수의 매개변수 p2에 *부호를 실수로 빠뜨렸다. 이해 바란다.

위 사진은 틀린예시이다. ptr의 주소값을 넘겨줘야 ptr에 저장된 값을 바꿀 수 있다.

더블 포인터를 이용하여 swap 함수에 ptr의 주소를 매개변수로 주어야만 ptr의 값을 바꿀 수 있다.


 

✔chapter. 19 함수 포인터와 void 포인터

변수만 메모리에 저장되는 것이아니다. 함수 또한 바이너리 형태로 메모리 공간에 저장되어서 호출 시 실행이된다.

이렇게 메모리상에 저장된 함수의 주소 값을 저장하는 포인터 변수가 바로 '함수 포인터 변수'이다.

// 함수 포인터 변수 코드로 이해하기

int function (int n1, int n2) {...} // 일반함수
int (*fptr) (int, int) // 포인터의 선언
fptr = function; // 포인터의 function의 주소값 대입
fptr(3, 4) // function(3, 4)와 동일한 결과를 보임

 

void형 포인터 변수에는 어떠한 변수의 주소 값이든 담을 수 있다.

하지만 형에 대한 어떠한 정보도 담을 수 없어서 아무런 포인터 연산도 하지 못한다.

 

main 함수 역시 인자를 전달받을 수 있도록 제한된 형태의 매개변수 선언이 가능하다.