elevne's Study Note

C 공부 (4: 포인터(1)) 본문

Backend/C

C 공부 (4: 포인터(1))

elevne 2023. 1. 29. 17:46

C 언어에서는 포인터를 이용하여 컴퓨터의 메모리에 직접 접근이 가능하다고 한다. 아래와 같이 변수가 선언되었을 때

 

 

char ch1 = 'A', ch2 = 'Q';
int num = 7;

 

 

 

총 6 바이트 ( 1(char) + 1(char) + 4(int)) 가 메모리 공간에 할당되는 것이다.

 

 

 

 

 

 

이 때, 1 바이트 메모리 공간을 단위로 하나의 주소 값이 할당되며, 주소 값도 1 씩 증가하는 '메모리 주소 값'이 같이 배정된다. C 언어에서는 시작 번지만을 가지고 위치를 표현하게 되는데, 이는 왜냐하면 자료형 당 배정 바이트 수는 정해져있기 때문에 끝이 어디든지 쉽게 계산할 수 있기 때문이다. 이 때, 이 메모리 주소 값 또한 정수의 형태를 띄는데, 이 메모리 주소 값의 저장을 위해 마련된 변수가 바로 '포인터 변수'인 것이다.

 

 

 

정수 7 이 저장된 int 형 변수 num 을 선언하고 이 변수의 주소 값 저장을 위한 포인터 변수 pnum 을 선언한다. 그리고 나서 pnum 에 변수 num 의 주소값을 저장한다.

 

 

 

#include <stdio.h>

int main() {
    int num = 7;
    int * pnum;
    pnum = &num;
    printf("%d", pnum);
}

 

 

result

 

 

 

위 식에서 int * 부분이 int 형 변수의 주소 값을 저장하는 포인터 변수 선언 부분이 되는 것이다. pnum 은 int 형 변수의 주소 값을 저장할 수 있는 포인터 변수가 된다. 이후 pnum = &num 에서 & 연산자'오른쪽에 등장하는 피연산자의 주소 값을 반환하는 연산자' 이다. 그래서 위 문장은 & 연산의 결과로 변수 num 의 주소값이 반환되며, 이를 포인터 변수 pnum 에 저장하게 되는 것이다. (이 때 64비트 시스템에서는 주소 값을 64비트로 표현하기 때문에 포인터 변수의 크기는 8바이트, 32비트 시스템에서는 4바이트가 된다)

 

 

 

다시 정리해보자면 type * pointerVariable 의 형식으로 작성하여 type 형 변수의 주소 값을 저장하는 pointerVariable 변수를 선언해줄 수 있는 것이다.

 

 

 

그래서 일반적으로 & 과 * 연산자를 가리켜 포인터 연산자라고 부른다. 위 식은 아래와 같이 선언과 초기화를 동시에 진행해줄 수 있다.

 

 

 

#include <stdio.h>

int main() {
    int num = 7;
    int * pnum = &num;
    printf("%d", pnum);
}

 

 

 

이러한 포인터 변수에는 메모리의 주소값이 저장되고, 이를 이용해서 해당 메모리 공간에 접근도 가능하기 때문에 포인터와 관련해서는 상당히 주의를 해야한다고 한다. 포인터 값을 임의의 아무 숫자로 초기화해서는 안된다. 포인터 변수는 우선 선언만 해두고 이후에 유효한 주소 값을 채워넣는 방식을 사용해줄 수 있다.

 

 

 

#include <stdio.h>

int main() {
    int *ptr1 = 0;
    int *ptr2 = NULL;
}

 

 

 

위 코드와 같이 0 혹은 NULL 을 사용하여 초기화할 수 있다. 이처럼 포인터변수를 초기화하는 값 0 을 널 포인터라고 한다. 이는 0 번지를 의미하는 것이 아니라 아무 곳도 가리키지 않는다는 의미를 내포하는 것이다.

 

 

 

 

 

Reference:

윤성우의 열혈 c 프로그래밍

 

'Backend > C' 카테고리의 다른 글

C 공부 (6: Call by reference)  (1) 2023.03.07
C 공부 (5: 포인터(2))  (0) 2023.02.03
C 공부 (3: 배열)  (1) 2023.01.28
C 공부 (2: 반복문, static)  (0) 2023.01.27
C 공부 (1: ~ Casting)  (0) 2023.01.26