C 언어를 공부 중이다.

 

포인터에 대해 어느정도 알고 있었지만, 오랜만에 볼 때마다 헷갈리는 부분들이 있어서 다시 이해를 바로잡고자 정리 글을 써본다.

 

우선 포인터에 대해 이해하기 앞서 배경 지식이 필요하다.

 

0과 1로 컴퓨터는 어떻게 계산을 하는가? and, or, not, xor, nand, xnor, nor의 논리회로를 이용하여 계산하고 결과값을 저장한다.

이런걸 누적 시키면?

 
작은 논리회로, ALU(Arithmatic Logic unit)가 된다. 저 다리에 신호를 어떻게 주느냐 따라서 output 신호가 달라진다.

ALU가 모이면 CPU가 된다.

비약이 심했지만, 결론은 CPU 는 계산기다. 어디선가 데이터를 불러오고 어디론가 저장을 할 수 있어야한다.

그 어디서가? 어디인가?

CPU는 빠르게 데이터 처리를 하기 때문에 빠른 접근과 저장이 가능한 Cache(캐시)를 이용한다.

요즘은 CPU가 멀티 코어를 지원함으로써 각 코어에 가까운 작고 빠른 캐시(Cache L1)를 붙이고, 공유 개념의 L2, L3 Cache를 설계한다.

결국 이런 캐시 메모리들의 용량은 너무 작기 때문에, 데이터들을 오래 들고 있을 수 없다.

 

주기억장치 RAM으로 이동해야한다.

 

RAM은 Random Access Memory의 약자로, 저 수많은 금니들을 통해 각 검정칩에 저장된 데이터에 빠른 접근이 가능하다.

 

저장할 수 있는 용량이 CPU가 가진 용량보다 훠얼씬 많다.

 

그래서 우리는 프로그램을 RAM에 띄워놓고 필요한 부분만 CPU에서 계산하면 된다.

 

.....

 

포인터 이야기를 하다가 왜 여기까지 왔느냐 하면..

 

포인터는 이 RAM의 주소를 저장하기 떄문이다.

 

#include <stdio.h>
int main(){
    int a = 10;
    int* ptr = &a;
    *ptr = 5;
    printf("%d", *ptr);
    return 0;
}
 
5
 

포인터를 이용해 변수의 값을 변경한 간단한 코드다.

 

여기서부턴 개인적으로 이해하기 위한 주관적 해석입니다.

본디 변수(variable)는 2가지의 정보를 갖고 있다. Stored Data와 Memory Address 이다.

int a;
 

이 상태는 Stored Data는 Garbage data, Memory Address는 받아둔 상태라고 볼 수 있다.

 

10;
 

상수(constant)는 변수가 아니다. 따라서 저장할 수 없다.

 

int a = 10;
 

이 행위는 a 변수에 Garbage data 대신 10이라는 수가 이진수로 저장될 것이다.

00000000 00000000 00000000 00001010 (2)
 
 

 

감사합니다.

+ Recent posts