C, C++

함수의 포인터 표현 + 포인터와 배열의 차이점

SuuuuuuuL 2018. 12. 20. 10:37

문자열은 기본적으로 주소이다!



배열 : 배열명은 주소상수




함수: 함수명은 주소상수


 



Char str[] = “christmas” ;




이경우 크리스마스는 stack에들어가고




Str[0]= ‘C’; 하면 변경이 가능하다.




“christmas”[0] 표현도 가능, []배열 표시 앞에는 주소가 오면됨

 




 

배열의 포인터표현을 하는 경우..


 


Char* ptr = “Christmas;” 경우에는 배열과 다르게 수정은 되지 않음 




RO(read Only) 영역에 올라가 있는 값을 포인터로 가르키기 문에 수정불가



#include <stdio.h>

int plus(int a, int b){

    return a+b;

}


int minus(int a, int b){

    return a-b;

}

 

int main(){

    printf("%d\n", plus(10,20));

    printf("%u\n", plus); //함수는 RO영역에 올라가기 때문에 주소값이 찍혀나옴

    // 컴퓨터 공간에서 코드 RO영역이 상단, 아래는 heap, 제일 아래는 stack 으로 stack 부터 값을 채워서 사용

 

    int (*ptr) (int,int) = plus;

    //(리턴타입or void)(포인터)(매개변수 타입) = 함수명;

    // 포인터 변수는 리턴타입과 매개변수가 동일한 함수의 경우에는 모두 받을 있음

 

    // 이렇게 선언하고 나면 ptr 함수처럼 사용하는 것이 가능하다

    printf("%u, %u\n", plus, ptr);

    printf("%d\n", ptr(20,10));

    

    ptr = minus;

    printf("%d\n", ptr(20,10));

    return 0;

}



#include <stdio.h>

int plus(int a, int b){
    return a+b;
}

int minus(int a, int b){
    return a-b;
}

int mul (int a, int b){
    return a*b;
}

int mod(int a, int b){
    return a%b;
}
/*
매개변수 3개 - 함수포인터 변수, int 2개 */
int delegate(int(*ptr)(int, int), int a, int b){
    return ptr(a,b); // ptr이 가리키는 함수가 무엇인지에 따라서 결과값이 다르게 나옴
}

int main(){

    printf("%d\n",delegate(plus,10,20));
    printf("%d\n",delegate(minus,10,20));
    printf("%d\n",delegate(mod,10,20));
    printf("%d\n",delegate(mul,10,20));

    //기능을 추가하고 기능을 사용하는 것이 쉽고, 사용자들이 사용하기에 직관적이다.
    //함수명이 일종의 키워드처럼 작동되고 여러개의 함수를 사용하는 것이 자연스러워짐

    //자바스크립트에서도 함수를 호출하거나 매개변수로 받거나...함수를 던지고 받는것이 가능하지만
    //c에서는 포인터를 이용하여 가리키는 것이고 자바스크립트에서는 함수가 직접 날아다닌다(?)라는 개념- 메모리