함수의 주소와 함수포인터에 대입했을 때 주소값이 다른 이유를 잘 모르겠습니다.

익명 사용자의 이미지

아래처럼 함수포인터를 공부하던 중 실제 함수의 주소와 함수포인터에 함수를 대입하였을 때 주소가 다른 것을 발견했는데 왜 다른지 잘 이해가 가지 않아 글 남깁니다.

#include
using namespace std;

void func()
{
cout << "Hello World!" << endl;
}

int main()
{
void(*ptr)();
ptr = func;

return 0;
}

익명 사용자의 이미지

#include <iostream>
using namespace std;
 
void func(){
	cout << "Hello World!" << endl;
}
 
int main(){
	{
		int i;
		int *p = &i;
 
		cout << "변수 i의 주소: &i = " << &i << endl;
		cout << "포인터 p의 값: p = " << p << endl;
		cout << "포인터 p의 주소: &p = " << &p << endl;
	}
 
	cout << "====" << endl;
 
	{
		void (*ptr)() = func;
		cout << "함수 func의 주소: &func = " << reinterpret_cast<const void *>(&func) << endl;
		cout << "함수 func의 주소 (다른 방법): func = " << reinterpret_cast<const void *>(func) << endl;
		cout << "포인터 ptr의 값: ptr = " << reinterpret_cast<const void *>(ptr) << endl;
		cout << "포인터 ptr의 주소: &ptr = " << &ptr << endl;
	}
	return 0;
}

실행 결과: https://ideone.com/RYNo29

무슨 문제 있습니까?