C언어 - 함수 포인터의 원리

2020. 11. 15. 17:24개인공부/C언어

어떠한 함수의 주소값을 저장할수 있는지?

 

함수에 출력이 뭔지 입력이 뭔지? return parameter

 

함수포인터를 지정하려면 반환값이 void, int, double char 등등 무엇인지

그리고 입력값이 무엇인지 () (char) (int) 등등 지정해줘야함.

 

포인터란 결국 주소값을 저장하는 변수이다.

 

 

프로그램 코드( TEXT Segment) 

 

우리가 코딩하고 컴파일하면 exe 실행파일이 생기는데 이 실행파일은 하드디스크에 저장이된다. 

우리가  운영체제에게 실행파일을 실행해달고 요청하면 운영체제는 프로그램을 메모리에 복사해서 올린다

그 프로그램 코드 자체가 저장되는곳이 TEXT Segement( Read Only: 읽기전용)

 

그래서 문자열과 관련되어서 실수를 많이 할수있다. ( 읽기전용인데 바꾸려고 시도)

 

 

const char* message = "Banana";

하지만 message 라는 변수 자체는 Stack에 올라간다.

 

프로그래머는 함수의 이름을 이용해서 프로그램을 작성하지만 

컴파일러는 이름(식별자)들을 메모리에서 주소로 번역한다.

즉, 함수를 실행시킨다는 것은

메모리에서 함수의 주소 위치에 저장되어 있는 명령어들을 순차적으로 수행한다는 의미.

 

 

 

함수 포인터의 사용방법

void ToUpper(char* str)
{
	while(* str)
    {
    	*str = toupper(*str);
        str++;
    }
}

void ToLower(char* str)
{
	while (*str)
    {
    	*str = tolower(*str);
        str++;
    }
}



int main(){

	char str[] = "Hello, Wolrd!"
    
    void (*pf)(char*); // 함수포인터의 식별자는 pf, parameter는 char*
    
    pf = ToUpper; // ToUpper함수를 가르키도록 pf에 대입.
    // pf = &ToUpper; // 주소연산자를 붙여서 주소를 포인터에 대입하는 방식
    // pf = ToUpper(str); 
    
    printf("String literal %lld\n", (long long)("Hello, World!");
    // String literal 14842952  // Text Segment 영역
    
    printf("Function pointer %lld\n", (long long)ToUpper);
    // Function pointer 14815822 // Text Segment 영역
    
    printf("Variable %lld\n", (long long) str);
    // Variable 19921004 // Stack 영역
    
    
    (*pf)(str); //ToUpper(str); 과 같은 의미.
    //pf(str); //K&R X, ANSI OK
    
    printf("ToUpper %s\n", str);
    
    pf = ToLower;
    
    pf(str);
    
    printf("ToLower %s\n", str);
    
    pf = ToLower;
    
    pf(str);
    
    printf("ToLower %s\n", str);
    
   
   return 0;
  
   }
    
    
    
    
    
    

 

 

출처 : 홍정모의 따라배우는 C언어