C - 포.인.터

업데이트:

포인터

의미

  • 주소를 저장하기 위한 변수형
  • 변수인데 속에 담긴 내용은 메모리 주소

주소에 저장된 자료형은?

  • 그 주소에 어떤 형의 데이터가 있는지 명시하기 위해 포인터 앞에 자료형을 붙임
  • 이진수만 나열되어있는게 무슨 자료형인지 알수가 읎어요~

포인터에 저장된 주소도 변경 가능

역 참조 연산자

void update_value(void) {
    int score = 100;
    int* ptr = &score;

    printf(*ptr); // 역참조. 100
    *ptr = 50;
    printf(*ptr)  // 역참조.  50
}

참조?

  • 주소를 이용해 간접적으로 접근
    • 데이터 복사 없이 원본에 접근 가능

포인터는 참조에 의한 전달 vs 값에 의한 전달?

  • 원본이 바뀌니 -> 참조
  • 메모리 주소 값을 복사하니 -> 값에 의한 전달
  • 원본이 바뀌는지 안 바뀌는지가 중요함.

NULL 포인터

아무것도 가리키지 않는 포인터

  • 값이 0 인 정수 상수 표현식, 혹은 void* 로 캐스팅된 표현식

언제 사용하나?

  • 포인터 변수를 초기화하고 싶을 때
    • 아직 참조할 주소가 없을 때
  • 포인터 변수가 유효한 주소를 참조하고 있는 지 확인하고 싶을 때
    • NullPointerException을 막고 싶을 때
  • 댕글링 포인터를 막기 위해
    • 더 이상 사용하지 않는 데이터를 가리키는 포인터 변수를
    • 널 포인터를 이용해 리셋

존재하지 않는 메모리 주소에서 값을 읽어오려고 하면 문제가 터진다.

포인터의 크기

모든 포인터는 동일한 크기를 가짐

  • 32비트 아키텍처는 4바이트, 64비트 아키텍처는 8바이트

배열은 연속된 메모리라 모두 스택에 넣을 수 없음, 매개변수에 시작 위치(메모리 주소)만 전달했음

  • 배열과 포인터는 매우 유사함

포인터에 정수 1을 더한다는 건

  • 포인터의 위치를 다음 데이터의 위치로 이동한다. 1바이트를 더하는 것이 아니다. sizeof(자료형) 바이트를 더하는 것

  • nums[1] == ptr[1] == *(ptr + 1)

포인터의 용도

  1. 큰 데이터를 배개변수로 전달
    • 배열이 매개변수로 전달될 경우, 첫 번째 요소의 주소를 전달
  2. 반환값이 둘 이상일 때
    • 포인터를 사용하면 함수 안에서 원본을 변경할 수 있음
  3. 동적 메모리 할당
    • 함수의 범위에 상관없이 사용하고자 하는 데이터가 다음과 같은 경우에 해당하면 사용
      • 데이터의 크기를 컴파일 도중에 알 수 없거나
      • 프로그램 실행 수명 보다는 짧은 시간 동안만 사용하려고 할 떄
    • 동적으로 할당된 메모리는 연속된 메모리 덩어리 -> 포인터가 적합
  4. 그 외
    • 자료구조 구현 시 : 연결 리스트, 트리 등..
    • 임베디드 프로그래밍 등에서 하드웨어에 있는 메모리에 직접 접근해야 할 때

참고

POCU 강의 “C 언매니지드 프로그래밍”

태그: ,

카테고리:

업데이트:

댓글남기기