달력

52024  이전 다음

  • 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

[C언어 핵심강의 05] 포인터의 이해

 

변수란 무엇인가? 기록할 수 있는 공간 (블록)이다.

하드웨어 디스크 상의 어떤 위치의 블록 (실제로는 아주 아주 작은 조각)의 상태 (:기록된 형태. 즉 값)가 '0000 0111'라고 되어 있다 하자. 이는 2진수로서 10진수로 바꾸면 7이다.

 

만약 이 블록의 이름을 num 이라고 하면, 이제부터 이 블록은 num이라는 변수이며, 이 블록에 적힌 상태 7이 num의 값이다. 그리고 하드웨어 상에서 이 블록의 위치가 곧 num의 주소이다.

즉, '변수의 주소'는 하드웨서 상에서 블록(변수)의 위치를 표시해 놓은 숫자이다. 집 주소를 예로 들면, 우리집 우체통이 변수이고 우체통의 주소가 변수의 주소 그리고 우체통의 내용 (편지, 소포 등)이 변수의 내용이다.


그리고 컴퓨터가 2진수를 다루는 만큼 (즉, 값의 저장도 2진수 상태. 연산도 2진수를 기반으로 이루어짐), 메모리를 8비트나 16비트 단위로 표기한다. 그래서 메모리 주소를 흔히 16진수로 표현한다.

 

자 그럼..num의 값이 7이고 그 주소가 0x12ff76이라고 하자.

근데 이 num의 주소도 숫자이므로, 이 주소값을 다른 변수의 값으로 저장할 수도 있지 않을까?

있다. 그렇게 하겠다고 선언하는 지시자가 포인터 연산자 (*)이다.

 

따라서 포인터 변수는 다른 '변수의 주소값'을 값으로 저장하는 변수이다. 

 

아래 그림을 보면서 이해하자.

아래 pnum에 저장된 값은 num의 조소값이다. 즉, pnum==&num 이다.

그러면 'pnum의 값(주소)안에 있는 값(num의 값 7)'을 가리키고 싶을 때는 어케해야 할까?

이 땐 *을 붙혀, *pnum이라 한다.

 

 그럼 또 이렇게도 생각해 볼 수 있겠지...

pnum의 주소를 값으로 갖는 변수 ppnum (이를 더블포인터 라고 한다)을 말이야.

그럼 ppnum은 뭐지? &pnum이지

그럼 *ppnum은? pnum 즉, &num 이지.

글머 **ppnum은? *pnum즉, *(&pnum) 하여 7이지.

으크크크크~~  헷갈린다 그치?

그니깐 '포인터 연산자 표현'은 이해만 했다고 넘어가지 말고, *이랑 주소표시&를 앞뒤로 붙혀가며 그 형태에 익숙해 져야 한다구.

 

 

 위에서 설명한 내용을 한 화면에 합쳐 보았어.

 

 이상으로 포인터의 이해 : 변수의 개념, 변수의 주소, 더블포인터에 대해 공부해 보았습니다.

질문을 댓글로, 강의료는 손가락 꾸욱~*


Posted by C언어 보이
|