일반적인 포인터는 자료형을 가지고있다. 할당된 메모리 공간과 어떻게 접근할지를 알려주기 위해 다음과 같이 포인터에 자료형을 적게된다. 하지만, void형 포인터는 간접접근방식을 정하지 않고, 오로지 메모리 주소만 저장하게 된다. #include void main(void) { int k = 24; int *ptr = &k; printf("%d\n", *ptr); } 다음과 같이 접근방식으로 타입캐스팅하면, 사용할 수 있다. #include void main(void) { int k = 24; void *ptr = &k; printf("%d\n", *(int *)ptr); }
함수포인터는 함수를 가르키는 포인터이다. 함수포인터 배열은 여러 함수들을 나타내게 할 수 있고, 배열을 이용해 일반 변수 값에 접근하는 것과 같은 방식으로 배열처럼 함수들에게 접근 할 수 있다. void displayA(void){ printf("Call A\n"); } void displayB(void){ printf("Call B\n"); } int main(){ int i=0; void (* display[]) (void) = { displayA, displayB }; for(i=0; i
함수포인터는 단순 포인터 변수가 변수의 주소값을 가르키듯이, 함수 포인터는 함수의 주소를 저장한다. 실제 함수 명이 아닌, 다른 이름으로 참조할 수 있다. void displayA(void){ printf("Call A\n"); } int main(){ void (* display) (void); display = displayA; display(); return 0; } 다음과 같은 코드에서 display가 displayA를 가르키기 때문에, display()만을 호출했을 때, 참조되어지는 displayA가 호출된다.
포인터에 붙는 Const의 위치에 따라 모두 다른 의미를 가지게 된다.Const int *변수명데이터를 상수화하며, 포인터는 조작할 수 있다.int * const 변수명포인터를 상수화하며, 데이터는 조작할 수 있다.const int * const 변수명데이터와 포인터를 모두 상수화시켜서, 아무것도 변경할 수 없다.int const *변수명데이터를 상수화하며, 포인터는 조작 할 수 있다. 주석처리 된 부분은 모두 사용될 수 없다. int main(){ int tmp = 100; const int *ptr1 = &tmp; int * const ptr2= &tmp; const int * const ptr3= &tmp; int const *ptr4 = &tmp; //++(*ptr1); //++ptr2; //++..
int main(){ char *pt = "apple"; printf("%s \n", pt); return 0; } 다음과 같은 코드가 있다. pt값은 변경이 될 수 없다. 이유는 "apple"이라는 문자열은 문자열 상수로 상수가 저장되는 영역에 저장되게 된다. 그 저장된 "apple"이라는 문자열 상수에 pointer가 주소를 가르키는 꼴이 되고 만다. 상수는 바꿀 수 없기 때문에 상수 값 변경한다면 문제가 생길 수 있고, const char *pt = "apple";로 선언하는 것이 좀 더 좋은 방법인것 같다. 문자열 수정을 하기 위해서는 어떻게 할까? 문자열 수정을 위해서는 배열을 사용해도 된다. 배열은 상수영역에 있는 "apple"을 가져와 복사를 하여 스택 영역에 둔다. 때문에 변경을 해도 아무..
- Total
- Today
- Yesterday