일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- node.js
- 비트코인
- Servlet
- jQuery
- phaser
- EC2
- 웹소켓
- SQL
- AWS
- express
- autowired
- JavaScript
- JSP
- model1
- PL/SQL
- Ajax
- RDS
- 블록체인
- 암호화
- docker
- Spring
- tiles.xml
- 도커
- 웹게임
- 알고리즘
- websocket
- Cookie
- 배포
- HTML
- CSS
- Today
- Total
記錄
C) 포인터 본문
출처: 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 |