본문 바로가기
개발 언어/C, C++

[C 언어] 포인터의 개념과 & / *연산자

by 정권이 내 2021. 12. 6.

포인터

포인터란 메모리상에 위치한 데이터의 주소를 보관하는 변수이다.

int *p;

 

포인터 변수 p는 int형 데이터의 주소값을 저장할수있는 변수이다.

 

& 연산자

포인터변수에 어떤 변수의 주소값을 저장하려면 해당 변수의 주소값을 알아야한다. 이때 주소값을 알아내는

연산자가 바로 & 이다.

int *p;
int a = 10;

p = &a;

포인터 변수p는 int형 변수 a의 주소값을 저장한다.

 

* 연산자

& 연산자의 반대의 역할을 하는 연산자로 볼수있다. 포인터변수에 저장되있는 주소가 가르키는 실제

데이터값을 불러오는 연산자이다.

int *p;
int a = 10;

p = &a;
printf("%d", *p);

=> 10

* 연산자를 이용하여 포인터 p가 가르키는 데이터 a에 접근할수 있다.

 

이러한 점을 이용하여 응용을 하면 *연산자를 이용해 직접 데이터를 넣는것도 가능하다.

int *p;
int a;

p = &a;
*p = 10;    // a의 주소를 가진 포인터 p에 * 연산자를 이용해 데이터를 저장.

printf("%d", a);
=> 10

 

포인터의 타입

포인터가 변수의 주소값을 저장할때 왜 타입을 지정해서 만들어야하는지 의문이 들수있다.

 

주소 데이터는 변수 타입에 상관없이 32bit OS에서는 4byte, 64bit OS에서는 8byte 형식인데 타입지정에는

어떤 의미가 있는것일까?

 

가장 큰 이유는 포인터가 가르키는 실제 데이터를 불러올때 포인터의 시작주소부터 몇 byte를 읽어와야

하는지 알수있기 때문이다.

 

위의 그림처럼 변수 int 타입 변수 a와 double 타입 변수 b가 메모리상에 위치할때

각각 메모리에서 4, 8 byte의 공간을 차지하고 있다.

 

그리고 가상의 pointer 타입으로 포인터변수를 선언하여 a, b변수의 주소를 받는다고 생각해보자.

int a = 1;
double b = 1;

pointer *pa;
pointer *pb;

pa = &a;
pb = &b;

printf("a : %d", *pa);
printf("b : %f", *pb);

 

이때 포인터 변수 pa는 int형 변수 a의 주소를 가르키는데 pointer 라는 타입만으로는 a 의 시작주소부터

4byte를 읽어와야 하는데 몇 byte를 읽어와야 하는지 알수가 없다.

 

포인터 변수 pb도 마찬가지로 double형 변수 b의 주소를 가르키는데 역시 시작주소로부터 8byte를 읽어와야

하지만 알수가 없는 상태이다.

 

그렇기 때문에 포인터 변수 선언시 타입을 지정해야 포인터를 사용할때 메모리에서 시작주소로부터

얼마나 읽어야 하는지 알수 있는것이다.

반응형

댓글