記錄

C) 포인터 본문

Computer language/C

C) 포인터

surhommejk 2017. 12. 21. 12:05

출처: https://www.youtube.com/watch?v=QZWFH98hzpc







<C 포인터>




변수 이름이 같다고 해도 다른 주소값을 쓰기 때문에 변수명 만으로는

다른 함수의 값을 다른 함수가 변경할 수는 없다는 것을 보여준다












변수 선언시 컴퓨터는 심볼테이블을 가지고 있어서

변수에 접근할 때 테이블을 참조하여 주소값으로 접근











- 포인터 변수에도 자료형이 필요한 이유는 해당 포인터 주소로 가서 '이 주소를 따라갔을 때 몇 바이트를 읽어들일지'를 컴퓨터가 알 수 있도록 하기 위해서다.


ex) int_ptr은 int형 포인터 변수이므로 컴퓨터는 int_ptr이 가리키는 주소값으로 '4바이트를 읽어야겠다'고 작정(?)하고 가서 4바이트를 읽어온다. 마찬가지로 char_ptr은 1바이트, short_ptr은 2바이트를 읽는다. 포인터의 자료형으로 컴퓨터가 읽어올 바이트 길이를 지시하는 것이다.











(*i_ptr) 을 ++ 한 것으로 i값이 10에서 11로 바뀐 것을 알 수 있다. 즉, *은 '이 주소로 찾아가라' 라는 의미이다. 즉 주소값을 가진 변수(포인터 변수) 앞에 *을 붙임으로써 그 주소에 찾아가게 된다.


따라서 값을 변경한다고 해도 *을 붙여야만 '이 주소가 가리키는 곳의 값'을 바꿀 수 있는 것이다. *을 붙이지 않고 단순히 i_ptr만 쓴다면 이는 주소값 자체만을 의미하기 때문에 의도하는 i의 값의 변경은 되지 않는다. 마찬가지로 printf를 한다고 해도 i_ptr자체만 printf하면 주소값 자체가 나오고 *i_ptr처럼 *을 붙이게 되면 i_ptr이 가리키는 주소에 있는 값을 출력하게 된다.


* 의 역할 및 의미 : '이 주소 값이 가리키는 곳으로 가라'










main 함수에서 값을 변경하고 싶은 변수의 포인터 변수를 만들어서 주소값을 설정한다. 그 뒤 포인터 변수로 주소에 직접 접근하여 거기 할당된 값을 바꾸는 함수를 만들고(여기서는 plus) 이 함수의 parameter에 main 함수에서 만든 포인터 변수를 넣어서 실행하면 main에서 조작을 해서 값이 바뀌는 것이 아니라 plus에서 값 변경을 원하는 변수의 값이 바뀌게 된다.


즉, 포인터는 주소에 직접 접근을 가능하게 해서 지역변수라 할 지라도 다른 함수에서 접근해서 값을 바꾸는 것이 가능하게 해준다.

'Computer language > C' 카테고리의 다른 글

C) 배열과 포인터  (0) 2017.12.21
C) 배열  (0) 2017.12.21
C) 메모리 주소와 Align  (0) 2017.12.20
C) 메모리 구조 - 스택(Stack) - (2)  (0) 2017.12.19
C) 메모리 구조 - 스택(Stack) - (1)  (0) 2017.12.19
Comments