함수 포인터와 void 포인터
- 함수 포인터
함수 또한 메모리 상에 바이너리 형태로 올라가 호출 시 실행이 되는데, 메모리 상에 저장된 함수의 주소 값을 저장하는 포인터 변수가 함수 포인터 변수이다.
배열의 이름이 배열의 시작 주소 값을 의미하듯이 함수의 이름 또한 함수가 저장된 메모리 공간의 시작 주소 값을 의미한다.
함수 이름의 포인터 형은 반환 타입과 매개변수의 선언을 통해 결정 짓도록 약속. 즉, 반환 타입과 매개변수의 선언이 일치하는 모든 함수들의 포인터 형은 모두 같다.
9번 라인과 10번 라인에서 볼 수 있듯이
반환 타입 (*포인터변수이름) (매개 변수) = 함수 이름
다음과 같은 형태로 함수 포인터 변수를 선언하고 함수의 주소를 받아서 12번, 13번 라인처럼 함수 포인터 변수를 통한 함수 호출이 가능하다.
- Void 형 포인터 ( 자료 형이 없는 포인터 )
다음과 같이 선언되는 포인터를 void 형 포인터 변수라고 한다.
Void 형 포인터는 어떤 변수의 주소 값이든 함수의 주소 값이든 상관 없이 ‘주소’ 값의 경우는 무엇이든 전부 담을 수 있다. 다음 예는 void * 변수에 다양한 주소 값을 저장하는 예를 나타낸 것이다.
단, void 형 포인터 p를 이용하여 참조를 하는 순간(=포인터 연산을 하는 순간) 컴파일 에러가 발생한다. 왜냐하면 void * 포인터는 포인터 연산 시 증감의 크기에 대한 정보가 단 한 부분도 없다. 즉, 해당 주소로부터 어느 범위까지 연산을 하여 참조를 해야하는지에 대한 정보가 없기 때문에 참조(포인터 연산)가 불가능하다.
void형 포인터는 주소 값을 저장하는 것에만 의미를 두고 포인터 형은 나중에 결정한 참조하는 경우에 유용하게 사용된다 -> 동적 메모리 할당
- Main 함수를 통한 인자 전달
위의 예제에서 argc는 파일 이름을 포함한 전달 되어온 인자의 수를 나타내고, argv는 더블 포인터 형태로 싱글 포인터 혹은 싱글 포인터 배열의 각 요소를 가리킨다. 즉, argv는 두 번째 결과에서 “./t”, “yoo”, “seung”, “ho”의 주소 값인 char * 타입을 가리키기 때문에 더블 포인터 형태이다.
'컴퓨터 언어 정리 > C 언어' 카테고리의 다른 글
16 구조체 (0) | 2020.10.12 |
---|---|
15 문자와 문자열 (0) | 2020.09.29 |
13 다차원배열 및 포인터의 관계 (0) | 2020.09.21 |
12 포인터의 포인터 (0) | 2020.09.15 |
11 다차원 배열 (0) | 2020.09.14 |