포인터는 주소 값을 담는 변수이며 하나의 주소 값은 오른쪽 그림과 같이 1Byte 메모리 공간을 표현한다.
왜 메모리 블럭 하나를 1bit 또는 1KB로 하지 않았을까? 라는 궁금증이 생긴다면 그렇기 정했기 때문에 그렇다.
우리가 1평이 왜 1㎡가 아니라 3.3㎡이냐고 따지지 않는 것처럼 굳이 여기에 대해 타당성을 입증할 필요는 없다. 이 정도면 적당한 크기이기 때문에 그렇게 정하지 않았을까
그렇다면 1bit로 표현할 수 있는 메모리 공간의 크기는 얼마나 될까?
컴퓨터는 bit단위로 계산되기 때문에 1bit로 표현할 수 있는 메모리 공간은 0x0000, 0x0001 이렇게 2Byte가 된다.
그림에서는 0xFFFF 까지 표현했는데 이는 16^4= 65536이므로 64KB를 표현 할 수 있다.
"1bit가 2Byte를 표현 할 수 있다." 라는 의미가 헷갈린다면 그냥 1bit가 0과 1을 표현하므로 경우의 수가 2가지니까
메모리블럭 두 개인 2Byte 이다. 라고 생각하면 된다. 2bit 면 00 01 10 11 총 4가지니까 4Byte가 된다.
현재는 64bit 시스템이 주를 이루지만 몇 년 전까지만 해도 32bit 시스템이 주였던 시대는 메모리 공간을 얼마나 표현할 수 있었을까?
계산을 해보면 4GB(GB=Giga byte)가 된다. 그래서 RAM을 4GB 이상으로 장착을 해도 4GB까지 밖에 인식을 못했다.
개인적으로 컴퓨터에 대해 무지했을 당시에 32bit 시스템에서 4GB 이상으로 RAM을 업그레이드하고 컴퓨터가 빨라진 것 같다고 좋아했던 기억이 있다.
요즘엔 대부분 64bit 시스템 이기 때문에 메모리 용량 크기의 제한을 염두할 필요는 전혀 없다.
대충 이 정도로 컴퓨터 주소값에 대한 설명을 마무리하고 다시 포인터에 대해서 설명하자면 포인터는 기본 자료형 char, int, double 과 같은 자료형이다. 즉, 포인터형이라고 하고 이는 *(애스터리스크) 연산자로 표현한다.
포인터의 자료형은 int* : int형 포인터 , char* : char형 포인터 double* : double형 포인터 등이 있으며
*는 띄어쓰기를 해도 되고 안해도 된다. int* ptr 이나 int *ptr 이나 int * ptr 이나 같은 의미다.
포인터 변수 선언은 위와 같이 int*ptr; 같은 형태로 표현하며 이는 int형 포인터 변수 ptr 이라고 한다.
int*addr= int형 포인터 변수 add, 변수 이름이 addr 이며 자료형은 int 포인터 형이다. 라고 해석할 수 있다.
포인터는 주소 값을 담는 변수라고 했으니 addr에 주소 값을 담아야 하는데 이때 사용하는 연산자는 &(앤드) 이다.
사용법은 다음과 같다.
int num=10;
int * ptr; // ptr이라는 이름을 가진 변수를 int 포인터형으로 선언
ptr=# // 변수 num이 가지고 있는 주소 값을 반환해 ptr에 복사
오른쪽 그림과 같이 ptr 이라는 변수는 0x0010 이라는 주소 값을 담고 있고 num 이라는 변수는 10이라는 값을 가지고 있다. 따라서 printf("%d", ptr); 을 하게 된다면 0x0010을 출력하게 될 것이다.
근데 *는 포인터의 선언 말고도 단항 연산자로써 간접 참조 연산을 하기 위해서도 쓸 수 있다. 1
즉, 포인터가 가리키는 메모리 공간의 접근을 하는 연산자로 쓸 수 있다는 뜻이다.
printf("%d",*ptr) // ptr이 가리키는 메모리 공간(num)이 가지고 있는 값을 출력한다.
출력 결과 : 10
참고
* 연산자나 & 연산자처럼 두 가지 이상의 의미를 가지는 연산자가 몇 개 있다. 만약 *를 이항 연산자로 쓴다면 int num=5*3; 과 같이 곱하기로 쓰일 수 있고 &를 이항 연산자로 쓰면 비트단위 AND 연산을 하게 된다.
- *ptr은 ptr 포인터가 변수의 이름을 통해서 접근하는게 아니라 주소값을 통해 간접적으로 접근한다는 의미이다. 예를 들어 int a=3 인 경우 a라는 변수를 통해 3에 직접 접근하지만 *ptr=&num 은 변수 num의 주소를 ptr에 저장해 *ptr로 내용을 참고한다. [본문으로]
'Programming > C' 카테고리의 다른 글
문자열 입력과 출력 scanf_s, printf, fputs, fgets, _getch() (0) | 2021.01.08 |
---|
댓글