함수(function)는 프로그램에서 특정 작업을 수행하도록 정의된 코드 블록입니다. 자주 사용되는 코드를 함수로 한 번 정의해 두면 필요할 때마다 재사용할 수 있어, 프로그래머의 작업 부담을 줄이고 코드의 가독성과 유지 보수성까지 높여 줍니다.
주소(address)는 어떤 개체가 실제로 저장되어 있는 메모리상의 위치를 의미합니다. 프로그램을 구성하는 모든 코드 블록은 저마다 고유한 메모리 위치를 가지므로, 변수나 객체뿐만 아니라 메서드와 함수 역시 자신만의 메모리 주소를 갖습니다.
C와 C++에서 함수의 메모리 주소를 확인하는 방법은 의외로 간단합니다. 괄호 ()를 붙이지 않고 함수 이름만 사용하면, 그 이름은 해당 함수의 시작 주소를 가리키는 함수 포인터로 해석됩니다. 이 값을 printf의 %p 서식 지정자와 함께 출력하면 함수의 주솟값을 손쉽게 확인할 수 있습니다.
예제
#include<iostream>
using namespace std;
void myfunc(){
cout<<"This is myfunc";
}
int main(void){
printf("address of function main() is :%p\n", main);
printf("address of function myfunc() is : %p\n", myfunc);
return 0;
}실행 결과
address of function main() is :0x40079d address of function myfunc() is : 0x400787
코드 설명
위 예제에서 main, myfunc처럼 괄호 없이 작성된 함수 이름은 문맥에 따라 함수 포인터로 암묵적으로 변환됩니다. 따라서 &main과 main은 동일한 주솟값을 가집니다.
%p는 포인터(주소) 값을 16진수 형태로 출력하기 위한 서식 지정자입니다. 참고로 실행 결과에 나타나는 주솟값은 컴파일러, 운영체제, 빌드 환경에 따라 매번 다르게 출력될 수 있습니다.