요즘 포인터를 다루다가 헷갈리는 부분을 정리하고자 포스팅합니다.
우선 배열의 주소값을 포인터 매개변수로 사용할 수 있습니다.
void func(int *num) {...}
int main() {
int num[] = {1, 2, 3, 4};
func(num);
}
그럼 포인터와 배열의 이름의 다른점은?
배열의 이름은 const 포인터 입니다. 즉 상수값으로 되어있는 const 배열이죠
포인터의 조심해야 할 상황
int * func(){
int num[] = {1, 2, 3, 4};
return num;
}
int main(){
int *ptr;
ptr = func(); // error!!
}
func() 함수가 끝난 후, local 변수인 num[] 은 스택에서 버려야할 될 값, 즉 garbage value입니다. 따라서 ptr변수는 역참조(dereferenced)할게 없어져 버릴수도 있습니다.
Example
int * func(){
int num[] = {1, 2, 3, 4};
return num;
}
void gunc(){
int mum[] = {5, 6, 7, 8};
}
int main(){
int *ptr;
ptr = func(); // error!!
gunc();
}
func 함수가 스택에서 제거된 후, gunc() 함수가 덮어쓰이면서, 실상 ptr에는 gunc의 배열이 남아있게 됩니다. 따라서 ptr은 엉뚱한 gunc() 함수의 mum[] 변수를 참조해 버릴 수 있는 상황도 옵니다. 혹은 쓰레기 값이 들어가게 됩니다.
함수 포인터
int func(int a, int b){...}
int main(){
int (*ptrFunc)(int a , int b);
ptrFunc = func;
}
함수들에도 포인터가 있어서, 요론식으로 포인터를 사용해 함수를 변수처럼 이용 할 수 있습니다.