본문 바로가기
Language/C

[C언어] Pointer 개념정리

by SooooooooS 2023. 3. 14.
728x90

1. pointer란?

    ★ 메모리의 주소를 가지고 있는 변수 = 변수의 주소를 가지고 있는 변수

    ★ 기계어나 어셈블리 언어처럼 메모리 주소를 가지고 직접 메모리의 내용에 접근 가능!

    ★ 데이터의 복사를 피하고 데이터를 공유하여 작업하고자 할때 사용

 

2. 주소 연산자 &

#include <stdio.h>

int main(void){
    int num = 10;

    //주소 연산자 & 사용
    printf("num의 주소 : %u", &num);

    return 0;
}

num의 주소 출력

메모리 공간에 변수를 배치하는 것은 컴파일러의 권한이고 컴퓨터마다 주소는 달라진다.

%p 주소를 출력하는 형식 지정자(16진수로 출력)
%u 부호가 없는 10진 정수로 출력

 

3. 포인터 변수 선언하기

    ★ "포인터 변수" 즉, 사용하기 전에 선언되어야 한다.

    ★ 포인터가 가리키게 되는 대상을 먼저 쓰고 *를 붙인 다음, 포인터 이름 작성

    ★ 포인터를 선언할 때 int *p; 또는 int* p; 라고 쓸 수 있다. 일반적으로 전자와 같은 방법을 사용한다.

#include <stdio.h>

int main(void){
    int num = 10;
    int *p = &num;

    //포인터 p사용
    printf("num의 주소 : %u\n", p);

    return 0;
}

num의 주소 출력

4. 간접 참조 연산자 *

    ★ 간접 참조(dereferencing, indirection)

    ★ 포인터 p가 가리키는 주소에 저장된 내용을 가져오려면 *p라고 하면 된다.

    ★ 즉, 포인터가 가리키는 위치에 있는 데이터를 가져오라는 의미

#include <stdio.h>

int main(void){
    int num = 10;
    int *p = &num;

    printf("num의 주소 : %u\n", p);
    printf("간접 참조 값: %d", *p);

    return 0;
}

간접 참고 한 값 출력

 

    ★ 위의 경우 *p 와 num 은 같은 값이다.

    ★ 이때 p는 p가 가리키는 위치에 무엇이 있는지를 모른다.

    ★ int *p; 일 경우 p가 가리키고 있는 주소에서 int가 있다고 가정하고 4byte를 읽어들인다.

int형일 경우 p가 가리키고 있는 주소에서 4byte만큼 읽어온다.

char 1byte
int 4byte
float 4byte
double 8byte

5. 포인터 사용시 주의할점

  1. 초기화하지 않고 사용하는 것은 위험하므로 아무것도 가리키고 있지 않을 때 NULL(0)로 설정한다.
  2. 포인터 타입과 변수 타입은 일치해야 한다. → 일치하지 않으면 컴파일 오류 발생
  3. 메모리는 운영체제의 고유 권한이므로 포인터 사용시 절대 주소 사용은 특수한 경우에만 한다.

6. 포인터 사용의 장점

  1. 연결리스트나 이진 트리 등의 향상된 자료구조를 만들 수 있다.
  2. 메모리 매핑 하드웨어(memory mapped hardware) : 메모리처럼 접근할 수 있는 하드웨어 장치 를 사용할 수 있다.
  3. 참조에 의한 호출 : 포인터 매개변수를 통하여 외부의 변수나 배열에 접근하여 값을 변경할 수 있다.
  4. 동적 메모리 할당 : 프로그램이 실행 도중에 운영체제로부터 메모리를 실시간으로 할당 받는 기법 을 사용할 수 있다.
728x90

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

[C언어] 기본 문법 정리  (0) 2023.03.22
[C언어] MAC에서 Visual Stdio Code로 C언어 실행하기  (0) 2023.03.13