일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- C언어
- epoll_wait
- DOCKER-USER
- vtable
- level trigger
- wnourefresh
- wrefresh
- 풀이
- .nret core 배포
- iptables
- edge trigger
- LOB
- epoll
- 어셈블리어
- ncurses
- doupdate
- ioctl
- BOF
- rfc5508
- mvwin
- Compiler
- packet flow
- architecture
- packet filter
- REDIS
- 취약점
- .net core 7
- NAPT
- Docker
- cbpf
- Today
- Total
Tuuna Computer Science
[ C 언어 ] 포인터를 사용해야 하는 이유 본문
우리는 C 언어에서 가장 어려운 부분을 포인터라고 지목합니다.
그 이유는 메모리를 하드웨어적으로 접근해서 직접 다루기 때문입니다.
(C++이나 Java의 경우 메모리를 어떻게 관리하는지는 제가 배우지 않아 넘기고.)
그래서 C 언어가 High-Level언어 임에도 이 때문에 Low-level처럼 보일 수도 있습니다.
하지만 포인터의 개념을 잡은 상태에서 왜 우리가 포인터를 사용해야함을 이해한다면
더 이상 포인터는 단지 관리하기 편한 하나의 변수이지 않을까 생각합니다.
일단 포인터를 왜 써야함을 설명하지 전에 메모리에 대해서 조금 알아보자
메모리는 고정된 크기를 가지는 연속된 숫자를 가지는 저장공간의 연속이다.
예를 들어 256개가 있는 번호가 매겨진 우편함이라고 생각하면 쉬울 수 있다.
하지만, 우편함에 편지를 넣는 행위 즉, 메모리에 데이터를 넣는 행위는 큰 의미가 없다.
메모리에 든 값을 수정하거나 의미있는 값을 가질 때 의미가 있다.
그러면 메모리에 든 값을 어떻게 수정하냐
이 방법은 메모리의 주소를 이용해서 + or - 연산을 진행하는 것이다. ( CPU가...)
한 마디로 1000번지라는 주소가 있다고 가정해보자(메모리는 크기가 같은 크기의 연속된 저장공간)이라는 점을 이용해서 1050번지의 값을 수정하고 싶다면 1000번지에 + 50번지를 하면 된다.
그럼 이 방법으로 고객의 정보를 저장하고 수정하려 한다.
여러분의 회사는 여러분보고 우리 회사는 고객의 이름을 10바이트로 잡고,
고객의 주소를 50바이트로 잡을거야 참고해~ 라는 정보를 남겼다.
그럼 여러분은 이러한 값을 저장하고 참조하기 위해선 메모리의 시작번지인 고객의 이름(1000바이트)에 +10바이트를 해야 고객의 주소를 참조할 수 있다.
하지만 고객의 주소가 50바이트를 넘길 시에는 어떻게 참조할 것인가? 메모리크기를 넘기면 넘긴 데이터는 분실되고 만다. 그러면 여러분의 미래는....
이러한 단점을 어떻게 해결하느냐 바로 포인터다 포인터의 크기는 항상 32bit기준 4바이트로
지정한다는 점에서 착안할 수 있다.
즉 고객의 이름, 고객의 주소는 메모리의 어딘가에 넓게 넉넉하게 잡고 입력하고
고객의 이름에 대한 메모리 주소, 고객의 주소에대한 메모리 주소만 포인터변수에 넣으면 된다.
그럼 기준점 1000바이트를 기준으로 고객의 주소를 참조하고 싶으면
고객의 주소 바이트 크기가 얼마든간에 1000(기준 바이트)에서 + 4바이트만 하면 된다.
이 4바이트는 당연히 고객의 주소에 대한 메모리 주소가 담겨있으므로 쉽게 접근이 가능하다.
즉, 포인터를 사용하면 관리하기 편하고 안정성을 부여하므로
사용해야 하는것이 아닐까 생각합니다.
물론 위 내용들은 joinc 페이지 공부하던 중 일부 발췌 및 뇌피셜이 곁든 내용입니다.
공부하다가 느낀거 컴퓨터 구조를 꼭 배우자.... 주구장창 컴퓨터 언어만 배우기 보단
OOP가 왜 생겼는지 절차지향적 언어의 단점이 무엇이기에 또는 이 단점을 어떻게 극복했는지
등등 컴퓨터 구조를 배우고 난뒤 언어를 배우라는 repect한 분 때문에 2학기엔 컴퓨터구조를 수강해야겠다.
'C language' 카테고리의 다른 글
Logic_Game1 Aegis Royale ~ , ~ (0) | 2018.08.18 |
---|---|
[ C 언어 ] 포인터 처음 배울 때 보면 좋은 예제 (0) | 2018.08.05 |
C언로 만드는 RPG게임 (1) | 2018.06.23 |
포인터와 배열의 차이 (어셈코드) (0) | 2018.06.09 |
[C 언어]codeup문제 : 설탕 과자 뽑기 (0) | 2018.05.02 |