From 1d787ed3d986827bdf3b9bd43f398412535d526b Mon Sep 17 00:00:00 2001 From: Jieun <yjeka@ajou.ac.kr> Date: Thu, 13 Aug 2020 01:03:40 +0900 Subject: [PATCH] Update README.md --- pointer/README.md | 104 +++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 98 insertions(+), 6 deletions(-) diff --git a/pointer/README.md b/pointer/README.md index f6437b6..5542e10 100644 --- a/pointer/README.md +++ b/pointer/README.md @@ -23,12 +23,104 @@ |Array size can be set at runtime||O|O| |Can be resized|||O| +### const란 +변수를 상수화하기 위해 사용하는데, 쓰이는 위치에 따라서 용도가 조금씩 달라진다. +1. const int *n + * `데이터 상수화` + * n이라는 포인터가 가리키는 대상을 상수화 하겠다. + ```c + const int *n; + + int b = 10; + n = &b; + + *n = 30; //error(n이 지닌 값은 변경 안된다.) + ``` + -> 실제로 메모리 공간 자체가 상수화 된 것이 아니고, n이라는 포인터를 이용해서 데이터 변경을 막겠다. 하지만 변수 b를 이용하여 변경은 가능하다. +2. int* const n + * `포인터 상수화` + ```c + int a = 20; + int b = 10; + int* const n = &b; + + n = &a; //error + ``` + -> n이라는 포인터가 b를 가리키고 있을 때, 변수 a를 또 가리키도록 하는 것을 허용하지 않겠다. +3. const int* const n; + * `데이터, 포인터 둘다 상수화` + ### Noun-Adjective Form -1. int const a -2. int const * a -3. int* const a -4. int* const *a -5. int const * *a -6. int const* const* a +1. int const a + constant integer +2. int const * a + (variable) pointer to a constant integer +3. int* const a + constant pointer to a (variable) integer +4. int* const *a + pointer to a constant pointer to an integer +5. int const * *a + pointer to a pointer to a constant integer +6. int const* const* a + pointer to a constant pointer to a constant integer + +### Pointer - void * +* 주소값 안의 값에 대해 어떻게 해석해야 하는지에 대해 정해지지 않은 포인터 +* 어떤 포인터 타입이든 가질 수 있다. +* 하지만 actual data type과 its arithmetic step size는 알 수 없다. + +### Function pointer +* function pointer는 함수를 가리키는 변수(함수의 주소를 저장하는 변수) +* 마치 배열을 가리키는 포인터가 배열의 시작부분을 가리키는 것과 같이, 함수 포인터도 코드를 가리킬 때 코드의 시작부분을 가리킨다. +* 함수 포인터를 통해 메모리를 **할당**하거나 **회수**하는 것이 불가능하다. 따라서 함수 포인터를 대상으로 malloc(), free() 함수를 사용할 수 없다. +* 함수 포인터의 모양 + ```C + int (*FuncPtr) (int, int); //함수의 return형은 int이고, int형 파라미터 2개를 받는 함수다. + + int add(int first, int second); + double multi(double first, double second); + + FuncPtr = add //o + FuncPtr = &add //o + FuncPtr = multi //x + FuncPtr = add() //x + ``` +* typedef를 이용한 함수 포인터의 모양 + ```C + typedef int (*FuncPtr)(int, int); + + FuncPtr test = NULL; + test = add; + ``` +* 함수 포인트의 문법 + ```C + void prac1(int num){ + printf("%d\n", num); + } + + void prac2(int num){ + printf("%d\n", num); + } + + int main(){ + //#1 + void (*prac1_ptr)(int); //함수 포인터 선언 + prac1_ptr = &prac1; //prac1()함수의 주소값을 함수 포인터에 할당 + (*prac1_ptr)(3); //함수 포인터를 사용하여 prac1()함수 호출 + + //#2 + (*prac1_ptr)(3); //함수 포인터를 사용하여 prac1()함수 호출 + prac1_ptr(3); + (*prac1)(3); + prac1(3); + //#3 함수 포인터 배열 + void (*fp[2])(int, int); + fp[0] = &prac1; + fp[1] = &prac2; + (*fp[0])(3); + (*fp[1])(5); + return 0; + } + ``` -- GitLab