본문 바로가기
C/기말고사 대비(2022 1학기)

[C언어/기말] 포인터를 사용하는 이유

by Meaning_ 2022. 5. 17.
728x90
반응형

포인터를 사용하는 이유가 뭔지 항상 궁금했는데

이 예제를 보면서 알아냈다!

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
void F(int *T){
    *T=*T+10;
 
}
 
int main(){
    int a=5;
    printf("%d\n",a);
    F(&a);
    printf("%d\n",a);
 
 
 
}
cs

답은

5

15가 나온다.

 

전역변수 선언도 안하고 return도 안해줬는데 어떻게 가능한걸까?

main에서 a라는 공간을 만들어놓으면 원래는 a라는 공간을 밖에서 손대지 못한다.

하지만 포인터를 통해 주소를 넘겨주면 main함수 밖에서도 a라는 공간에 접근이 가능하다. 

그럼 여기서 전역변수를 안쓰고 왜 포인터를 썼나 싶을 수도 있다. 포인터의 가장 큰 장점이라 하면 전역변수의 약점을 보완해주는 것이다. 전역변수는 모든 곳에서 접근이 가능한 것이 장점이자 단점이다. 

전역변수는 프로그램 종료 때까지 메모리 공간을 잡고 있는데 포인터는 메모리를 효율적으로 사용하게 한다.

 

https://okky.kr/article/467349

 

OKKY | [C언어]전역변수 말고 포인터를 써야하는 이유가 뭘까요??

전역변수로 선언 후, 해당 변수들을 사용해도 되는거 아닌가요? 굳이 포인터를 써서 접근해야 하는 이유가 뭘까요?

okky.kr

괜찮은 답변이라 공유한다.

 

 

call by value - 값에 의한 호출 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
void F(int T){
    T=T+10;
 
}
 
int main(){
    int a=5;
    printf("%d\n",a);
   F(a);
    printf("%d\n",a);
 
 
 
}
cs

이러면 답이 

5

가 된다. 10을 더한 것이 반영되지 않는다. 왜냐면 값만 넘겨줬기 때문에 주소값에 접근도 못하고, 전역변수 선언도 안하고, 리턴도 없으니까 바뀐 결과를 반영할 수 없는 것이다.

 

call by reference - 주소 전달 방식

 

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
void F(int *T){
   *T=*T+10;
 
}
 
int main(){
    int a=5;
    printf("%d\n",a);
    F(&a);
    printf("%d\n",a);
 
 
 
}
cs

이렇게 주소값을 전달하면 매개변수 T의 주소값이 사실상 a의 주소값이니까 

*T=*T+10을 하면 *(&a)=*(&a)+10이 되면서 a=a+10이 된다.

주소값을 통해 접근하면 굳이 main함수에서 선언하지 않은 변수도 함수 바깥에서 접근할 수 있고 이 값을 심지어 수정할 수도 있다!!

728x90
반응형

댓글