본문 바로가기
OS/Linux

[Linux/C] 포인터

by dev_Step 2022. 3. 23.

리눅스의 꽃 포인터

 

int * 
char *
float *
double *
short *
를 sizeof 하여 보면 8byte가 나오게 되는데 이것은 컴퓨터 구조에 영향이 있다.
32bit 컴퓨터는 포인터가 4byte이다. 
32bit 컴퓨터는 램을 4기가 이상 못 꼽는다.  
각 주소번지마다 1:1 매칭이되야함 (랜덤엑세스)

왜다 8byte로 나오냐 ? --> 
결국 포인터에 저장되는것은 메모리 주소 값이 저장된다. 
64비트 컴퓨터의 경우는 8바이트의 주소값이 나오게 되므로 해당 주소를
수용할 수 있는 8byte가 나오게된다.

해당 내용의 결과값을 가지고 그림으로 설명해보자.

그림을 말로 설명해보자

가장먼저 

int a= 3; 을 통해서        메모리 주소를 a로 정의하고 해당 주소에 3을 대입하였다

printf("a : %d\n", a); 를 통해서 a의 값을 출력 할 경우 a 가 출력이 되게 된다.

 

printf("&a : %d\n", &a);  의경우는  a라고 저장된 메모리의 주소를 출력하는 것으로 

a라고 정의된 메모리 주소    -2078466212 가 출력되었다.

 

포인트의 경우 변수에 *를 붙여서 포인터 변수라는 것을 식별할 수 있으며

포인터 변수에는 일반적으로 메모리의 주소가 들어가게 된다.

 

메모리 봉에서  메모리 주소를 pa라고 정의 하였으며 해당 메모리 주소에 &a 를 대입한다

즉 a의 주소 값이 저장된다.

int *pa = &a;

따라서 

printf(" pa  : %d\n", pa); 의경우 a의 메모리 주소인   -207846612가 출력되었다.

 

*pa = 5; 의경우는 

pa라고 정의된 메모리 주소안에 들어가 있는 메모리 주소로 이동하여 해당 주소의 값을 변경하는것으로

지금 상황에서는 *pa = 5; 는 a = 5; 와 동일한 경과를 나타낼수 있다. 

즉 pa 에 저장된 주소는 -207846612이므로 a가 정의된 주소이고 해당 주소로 이동하여 5로 변경하는 것이므로

printf(" *pa : %d\n", *pa); 의 경우는 5로 나타내지며 a값도 5로 나타난다.

 

마지막으로 

&pa 의경우는

pa라고 정의된 메모리 공간의 주소를 나타내는것으로 -2078466208이나왔다.

 

 

 

더블 포인터도 동일하다. 그림으로 보자

이중 포인터도 동일하게 

 

ppo = &po 를 통해서 po의 메모리 주소를 ppo에 저장하게 되었다.

printf(" ppo : %d\n", ppo ); 를 찍어보면  &po와 동일한 값이 출력되는 것을 확인 할 수 있다.

 

*ppo 의경우는  ppo에 저장된 값을 메모리로보고 해당 주소로 넘어가서 해당 메모리에 저장된 값을 출력한다

즉  ~1544를 값으로 보지 않고 메모리 주소로 보고 해당 주소로 이동하여 저장된 x~1540을 출력하게 된다.

 

**ppo의 경우는 위에서 했던거에서 한번더 x~1540을 값으로 보지 않고 메모리로 보고 해당 주소로 이동하여

저장된값인 5를 출력하게 된다.

 

'OS > Linux' 카테고리의 다른 글

[Linux/C] GDB  (0) 2022.03.25
[Linux/C] 함수 포인터  (0) 2022.03.24
[Linux/C] 비트연산자  (1) 2022.03.16
[Linux/C] C언어 서식 변환 문자  (0) 2022.03.13
[Linux] Ubuntu 20.04 설치  (0) 2022.03.11