반응형

Point라는 변수는 주소값을 저장하는 변수이다.

여기서 주소값은 정수로 저장되기 때문에 int형 변수에 주소값을 저장 할 수도 있다.

그렇다면 왜 C에서는 Point라는 변수에 따로 주소값을 저장하는걸까?

메모리에 저장된 주소값

위 사진과 같이 변수 num의 주소값은 정수 0x12ff76이다.

정수이기 때문에 int변수에도 저장과 출력이 가능하지만 메모리 주소에 접근하지는 못한다.

우리가 주소값을 얻는 이유가 뭘까?

현실에서 생각해보면 부산광역시 남구 감만동이라는 주소를 알고 거기에 찾아가기 위해 우리는 주소를 집마다 부여한다.

컴퓨터에서도 메모리의 주소를 알고 주소에 접근(찾아가기)위해 Point 변수를 사용한다.

 

point변수의 크기는 64bit 시스템에서는 8byte이고 32bit 시스템에서는 4byte이다.

포인터변수 앞에서 자료형을 정해주는 이유는 8byte포인터가

int num=7;
int* pnum;
pnum = #

정수형 변수 num을 가리킨다면 포인터 변수 pnum은 int형 포인터 변수로 4바이트 메모리 공간에 부호 있는 정수의 형태로 데이터를 읽고 쓴다.

4byte까지 읽는다

그렇다면 만약 double 변수형에 int*(정수 포인터)로 연산하면 어떻게 될까?

	double num = 7.3;
	int* pnum = #
	*pnum = 4;
	printf("%d", *pnum);

형이 불이치 하지만 컴파일은 된다.

pnum이 가리키는 것은 double형 변수인데, pnum이 int형 변수이므로 int형 데이터처럼 해석된다.

 

다시 말하면

int형 포인터 변수는 4바이트 메모리 공간까지 읽고

double형 포인터변수는 8바이트 메모리 공간까지 읽는다.

포인터 변수마다 각각의 고유 자료형 이름을 가지는 이유는 변수가 시작되는 주소 값에서 얼마만큼의 크기를 읽어드릴지 위한 단위의 지정​하기 위함이다.

 

그래서 포인터의 형과 변수의 자료형을 맞춰줘야한다.

 

포인터 사용 방법

#include <stdio.h>

int main()
{
	int num = 100, num2 =100;
	int* ptr; //포인터 변수 선언
	ptr = &num; //ptr을 num주소값으로 초기화한다.
	*ptr += 30; //포인터가 가리키는 주소값에 변수의 값을 바꾼다.
	ptr = &num2;//ptr은 num2를 가리킨다.
	*ptr -= 30;//num2 -= 30과 동일

	printf("%d / %d", num, num2);
	
	return 0;
}

type없이 *ptr만 하면 메모리의 주소에 직접방문 할 수 있다.

직접방문해서 *ptr이 가리키는 값에 연산을 할 수도 있고, *ptr이 가리키는 값을 직접 출력할 수도 있다.

 

&는 변수의 주소 값을 반환한다.

 

-윤성우 열혈C프로그래밍을 참고해여 작성한 글입니다.

반응형

+ Recent posts