본문 바로가기
Language&Framework&Etc/C

포인터의 이해(12-1) 포인터란 무엇인가?

by 머리올리자 2020. 12. 7.

포인터(pointer)는 프로그래밍 언어에서 다른 변수, 혹은 그 변수의 메모리 공간주소를 가리키는 변수를 말한다. 포인터가 가리키는 값을 가져오는 것을 역참조

[위키백과 참조]

 

포인터 (프로그래밍) - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. 포인터(pointer)는 프로그래밍 언어에서 다른 변수, 혹은 그 변수의 메모리 공간주소를 가리키는 변수를 말한다. 포인터가 가리키는 값을 가져오는 것을 역참조

ko.wikipedia.org

C언어가 Low 레벨 언어의 특성을 지닌다고 이야기하게 만든 장본인

왜?

포인터를 이용하면 메모리에 직접 접근이 가능하기 때문

주소 값의 저장을 목적으로 선언되는 포인터 변수

변수가 메모리에 어떻게 존재하게 되는지 확인

#include <stdio.h>

int main(void)
{
	char ch1='H', ch2='i';
	int num=6;
}
  • 총 6바이트(1바이트 + 1바이트 + 4바이트)가 메모리 공간에 할당된다
  • 나란히 할당될 수도 있지만 나란히 할당되지 않을 수도 있다

  • 위 그림에서 메모리 블록(1바이트 기준)의 상단 -> 메모리 주소 값
  • 1바이트의 메모리 공간을 단위로 하나의 주소 값이 할당되며, 주소 값도 1씩 증가한다.
  • 변수 ch1과 ch2는 0x006FFB57와 0x006FFB58에 할당되어 있으며, 정수 7은 0x006FFB59에 할당된 것으로 표현
  • int형 변수 num은 어디에 할당? : "int형 변수 num은 0x006FFB59에서부터 0x006FFB5C에 걸쳐서 할당되어 있다"
  • int형 변수 num은 어디에 할당? : "int형 변수 num은 0x006FFB59에 할당되어 있다."

변수의 주소 값 0x006FFB59 역시 정수이다 → 저장이 가능한 값이며, 저장을 위해 마련된 변수가...

"포인터 변수"


포인터 변수와 & 연산자에 대해서 간단히 맛보기

"정수 7이 저장된 int형 변수 num을 선언하고 이 변수의 주소 값 저장을 위한 포인터 변수 pnum을 선언하자. 그러고 나서 pnum에 변수 num의 주소 값을 저장하자"

 

위 내용을 코드로 작성 시

#include <stdio.h>

int main(void)
{
	int num = 7;
	int* pnum; // 포인터 변수의 선언
	pnum = &num;

}

pnum : 포인터 변수의 이름

int* : int형 변수의 주소 값을 저장하는 포인터 변수의 선언

pnum = &num : num의 주소 값이 반환되며, 이를 포인터 변수 pnum에 저장하게 된다

※ & 연산자 : 오른쪽에 등장하는 피연산자의 주소 값을 반환하는 연산자

 

위 내용을 그림으로 표현하면 아래와 같다

포인터 변수 pnum에는 변수 num의 시작번지 주소 값이 저장된다

 

"포인터 변수 pnum이 int형 변수 num을 가리킨다"

 

  • num의 크기는 4바이트(32bit)인데 포인터 변수 pnum의 크기는 8바이트(64비트)로 묘사
  • 그렇다면 포인터 변수의 크기가 8바이트?

≫ 포인터 변수의 크기는 4바이트가 될 수도 있고 8바이트가 될 수도 있다.

  • 32비트 시스템에서는 주소 값을 32비트로 표현하기 때문에 포인터 변수의 크기가 4바이트
  • 64비트 시스템에서는 주소 값을 64비트로 표현하기 때문에 포인터 변수의 크기가 8바이트

실제로 테스트 해보니...

x86 즉 32비트일 때는 포인터 변수의 크기가 4 바이트
64비트일 때는 포인터 변수의 크기가 8 바이트

 


포인터 변수 선언하기

- 포인터 변수는 가리키고자 하는 변수의 자료형에 따라 선언하는 방법이 달라진다.

- 사실 주소 값은 동일한 시스템에서 그 크기가 동일하며 모두 정수의 형태를 띤다.

- 그래도 가리키고자 하는 변수의 자료형에 따라서 선언하는 방법이 다음과 같이 달라짐

 

int* pnum1;

  int*는 int형 변수를 가리키는 pnum1의 선언

 

double* pnum2;

  double* 는 double형 변수를 가리키는 pnum2의 선언을 의미

 

unsigned int* pnum3;

  unsigned int* 는 unsigned int형 변수를 가리키는 pnum3의 선언을 의미

 

▶포인터 변수 선언의 기본 공식

 

type* ptr;

   type형 변수의 주소 값을 저장하는 포인터 변수 ptr의 선언

 


포인터 형(Type)

int, char, double과 같이 변수의 선언 및 구분에 사용되는 키워드를 '자료형'이라 하듯이 포인터 변수의 선언 및 구분에 사용되는 int*, char*, double* 등을 가리켜 '포인터 형(type)'이라 한다

 

포인터 변수도 값을 저장하는 변수이기 때문에 '포인터 형' 역시 '자료형'의 범주에 포함시키기도 함

 

포인터 변수 표현

 

int* int형 포인터
int* pnum1; int형 포인터 변수 pnum1
double* double형 포인터
double* pnum2; double형 포인터 변수 pnum2

 

표현 원리

type* type형 포인터
type* ptr; type형 포인터 변수 ptr

 

*의 위치는 상관 없다

 

int * ptr;

int* ptr;

int *ptr;

 

 

 

참고 : [윤성우 열혈 C 프로그래밍] - 대부분의 내용 및 코드는 이 책에서 개인 공부 정리 목적으로 참고하였습니다.