포인터

FastCampus All-In-One 패키지 중 C/C++ 수업을 듣고 정리한 자료입니다.

실행환경: Windows 10

학습목표

  • 포인터의 개념과 활용 방법을 학습
  • 포인터를 사용했을 때의 강력한 기능을 이해

포인터의 개념


  • 변수는 그 자체로 자신의 자료형에 맞는 값을 저장한다
  • 포인터(Pointer)변수는 특이한 변수로 메모리 주소를 저장한다.

pointer1

  • 포인터는 특정한 변수 자체가 존재하는 메모리 주소의 값을 가진다.

  • 위의 예제에서는 기존 a를 이용하거나

    포인터 변수인 b를 이용해서도 5라는 값을 찾을수 있다.

  • int *b = &a;처럼 선언할 때 쓰는 *는 포인터 변수임을 알려주는 목적

  • 이후에 *b라고 쓰면 포인터 변수 b가 가리키는 주소의 값을 의미

포인터 관련 연산자


  • 주소 연산자(&) - 변수 앞에 붙어서 변수의 메모리 시작 주소값을 구한다
  • 포인터(*) - 포인터 변수를 선언할 때 사용한다
  • 간접 참조 연산자(*) - 선언된 포인터 변수가 가리키는 변수를 구한다

포인터의 개념 예시

#include <stdio.h>

int main(void) {
    int a = 5;
    int *b = &a;
    printf("%d\n", *b);
    system("pause");
}
  • int *bprintf("%d\n", *b)*b는 생긴것만 같고 기능은 다르다

결과

5
계속하려면 아무 키나 누르십시오 . . .

배열 각 원소의 주소 값 출력하기

#include <stdio.h>

int main(void) {
    int a[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
    int i;
    for (i = 0; i < 10; i++) {
        printf("%d\n", &a[i]);
    }
    system("pause");
}

결과

15989360
15989364
15989368
15989362
15989366
15989360
15989364
15989368
15989362
15989366
계속하려면 아무 키나 누르십시오 . . .
  • 각 컴퓨터 마다 저장 값이 다르므로 결과는 다르게 나올수 있다.

  • 끝자리가 4씩 증가하는지 확인

포인터의 강력한 기능


  • 포인터는 컴퓨터 시스템의 특정한 메모리에 바로 접근할 수 있다.
  • 따라서 기존에 존재하던 중요한 메모리 영역에 접근하지 않도록 해야한다
  • 주소값만 보면 해당 변수가 어떤 역할을 하는지 모르기 때문에 조심해야함.
int *a = 0x33484735;
*a = 0;

다중 포인터 예시

#include <stdio.h>

int main(void) {
    int a = 5;
    int *b = &a;
    # 포인터의 포인터 변수라는 의미
    # 간접 참조 연산자를 두번 넣어야한다
    int **c = &b;
    printf("%d\n", **c);
    system("pause");
}

결과

5
계속하려면 아무 키나 누르십시오 . . .

배열과 포인터 예시

#include <stdio.h>

int main(void) {
    int a[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
    int *b = a;
    printf("%d\n", b[2]);
    system("pause");
}
  • a라는 배열의 이름 자체를 주소값으로 사용
  • 내부적으로 배열의 이름 자체는 주소값 자체를 가지고 있기 때문에 위 처럼 사용 가능(&이 안붙은 이유)

결과

3
계속하려면 아무 키나 누르십시오 . . .

요약


  • 포인터는 특정한 변수가 메모리 상에 존재하는 위치 주소를 저장한다.
  • 포인터는 특정한 메모리 주소에 바로 접근할 수 있으므로 조심스럽게 사용해야 한다.

Reference


패스트캠퍼스 컴퓨터공학 올인원 패키지

Comments