본문 바로가기
프로그래밍 언어/C 언어

[C] 포인터 변수 개념

by 까망 하르방 2021. 3. 20.
반응형

포인터

포인터 변수란 메모리의 주소 값을 저장하기 위한 변수

#include <stdio.h>
#include <string.h>

int main(void) {
    int num = 7;
    int* p; // 포인터 변수 선언
    p = &num; // num의 주소값을 포인터 변수 p에 저장
    printf("%d", *p); // 포인터 p가 가리키고 있는 실제값 출력
}

포인터 변수 p이 int형 변수 num을 가리킨다.

포인터 변수는 double *p;와 unsigned int *p; 같이 선언
 
포인터 형(type)은 메모리 공간을 참조하는 기준이 됩니다. - int (4 byte), double (8 byte)
#include <stdio.h>
#include <string.h>

int main(void) {
        double num = 3.14; // double 형 변수
        int* p = &num; // 형(type) 불일치
        printf("%d", *p); // 예측 불가능한 값 출력
}

 

C언어는 메모리 접근이 유연하기 때문에 위의 코드는 컴파일 에러가 발생하지 않는다. 

하지만 double형 변수를 4바이트를 읽어 해석하기 때문에 잘못된 결과가 나옵니다.
그렇기에 포인터형을 통해 메모리의 접근시 유의해야 합니다.
 
 
int *b = &a;처럼 선언할 때 사용하는 *는 포인터 변수임을 알리기 위한 목적(선언)
이후에 *b 라고 쓰면 포인터 변수 b가 가리키는 주소의 값을 의미.
따라서, 아래 두 개의 * 연산자는 다른 의미를 가집니다. 
#include <stdio.h>
#include <string.h>

int main(void) {
        double num = 3.14; 
        int* p = &num; 
        printf("%d", *p); 
}

 

포인터의 잘못된 사용 예제

- 선언시 초기화를 해주지 않으면 메모리는 쓰레기값을 가리키고 있습니다.
   잘못된 메모리 접근을 방지하고자 RTE 발생
- 보통 NULL로 선언해줍니다. "아무데도 가리키지 않는다."
  (실제로 이는 상수 0으로 정의되어 있다.)
#include <stdio.h>
#include <string.h>
int main(void) {
        int* ptr; // 빌드시 RTE 발생
        *ptr = 200;
        printf("%d", *ptr);
}
 
 
위의 코드와 마찬가지로, 빌드시 RTE 발생하지만, 
잘못된 메모리의 접근에 대해 보호장치가 없는 운영체제에서도 치명적인 영향을 주지 않는다.
#include <stdio.h>
#include <string.h>
int main(void) {
        int* ptr = NULL; // 선언과 동시에 초기화
        *ptr = 200; // 아무것도 가리키지 않는 곳에 값을 할당하므로 RTE 발생
        printf("%d", *ptr);
}
 

 

반응형

댓글