함수 포인터와 void 포인터

유석현(SeokHyun Yu)·2022년 7월 20일

C

목록 보기
19/26
post-thumbnail

1. 함수 포인터와 void 포인터

변수만 메모리 공간에 저장되는 것은 아니다.

프로그램 실행의 흐름을 구성하는 함수들도 바이너리 형태로 메모리 공간에 저장되어서 호출 시 실행이 된다.

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


프로그래머가 정의하는 모든 함수는 프로그램 실행 시 '메인 메모리'에 저장되어서 실행이 된다.

그리고 함수의 이름은, 메모리상에 저장된 함수의 주소 값을 의미한다.

배열의 이름이 배열의 시작주소값을 의미하듯, 함수의 이름도 함수가 저장된 메모리 공간의 주소 값을 의미하는 것이다.

물론 배열의 이름과 마찬가지로 함수의 이름도 그 형태가 상수이다.

이러한 함수의 주소 값 저장을 위한 포인터 변수를 별도로 선언할 수 있으며, 이러한 용도로 선언된 포인터 변수를 가리켜 '함수 포인터 변수'라 한다.

선언하는 방법은 다음과 같다.

int SoSimple(int num1, int num2)
{
   ...
}

int main(void)
{
   int (*fptr)(int, int) = SoSimple;

   fptr(1, 2);

   return 0;
}

다음과 같이 선언되는 포인터 변수를 가리켜 'void형 포인터 변수'라 한다.

void * ptr;

void형 포인터 변수는 무엇이든 담을 수 있는 바구니에 비유할 수 있다.

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

하다못해 함수의 주소 값도 담을 수 있다.

하지만 void형 포인터 변수를 가지고는 아무런 포인터 연산도 하지 못한다.

값의 변경이나 참조도 불가능하다.

void형 포인터 변수에는 가리키는 대상에 대한 어떠한 형 정보도 담겨있지 않으므로 이는 당연한 것이다.

그래서 void형 포인터는 일단 주소 값에만 의미를 두고, 포인터의 형은 나중에 결정할 때 사용된다.


2. main 함수로의 인자전달

프로그램 실행 시 main 함수로 전달할 인자를 열거할 수 있으며, main 함수 역시 이러한 인자를 전달받을 수 있도록 제한된 형태의 매개변수 선언이 가능하다.

그럼 이와 관련해서 다음 코드를 실행해보자.

#include <stdio.h>

int main(int argc, char* argv[])
{
	int i=0;
	printf("%d\n", argc);
	
	for(i=0; i<argc; i++)
		printf("%d번째 문자열: %s \n", i+1, argv[i]);
	
	return 0;
}

출력 결과는 입력에 따라 달라지지만, 가장 기본적인 결과 2개를 살펴보면


이렇듯 argc에는 공백을 기준으로 문자열들의 개수가 저장되고, argv에는 그 문자열들이 배열에 일일이 저장된다.

profile
Backend Engineer

0개의 댓글