[정보처리기사 필기] 프로그래밍 언어 활용 - 104. 포인터

1. 포인터와 포인터 변수

  • 포인터 : 변수의 주소, C언어에서 주소를 제어할 수 있는 기능을 제공
  • 포인터 변수
    • 변수의 주소를 저장할 때 사용하는 변수
    • 필요에 의해 동적으로 할당되는 메모리 영역인 힙 영역에 접근하는 동적 변수
  • 포인터 변수의 선언 : 자료의 형을 먼저 쓰고, 변수명 앞에 간접 연산자 *를 붙임 (ex. int *a;)
  • 포인터 변수에 주소를 저장할 때 : 변수의 주소를 알아낼 때는 변수 앞에 번지 연산자 &을 붙임 (ex. a = &b;)
  • 실행문의 포인터 변수에 간접 연산자 *를 붙이면 해당 포인터 변수가 가리키는 곳의 값을 말함 (ex. c = *a;)
  • 포인터 변수의 용도
    • 연결된 자료 구조를 구성하기 위해 사용
    • 동적으로 할당된 자료 구조를 지정하기 위해 사용
    • 배열을 인수로 전달하기 위해 사용
    • 문자열을 표현하기 위해 사용
    • 커다란 배열에서 요소를 효율적으로 저장하기 위해 사용
    • 메모리에 직접 접근하기 위해 사용
  • 예제
main()
{
	int a = 50;	//➊ 정수형 변수 a를 선언하고 50으로 초기화
    int *b;	//➋ 정수형 변수가 저장된 곳의 주소를 기억할 포인터 변수 b를 선언
    b = &a;	//➌ 정수형 변수 a의 주소를 포인터 변수 b에 기억시킴. b에는 a의 주소가 저장됨
    *b = *b+20;	//➍ b가 가리키는 곳의 값에 20을 더함. b가 가리키는 곳이 a이므로 결국 a의 값도 바뀜
    
    printf("%d, %d", a, *b);	//➎ 결과 : 70, 70
    // ➋와 같이 선언할 때 *는 해당 변수가 포인터 변수라는 것을 의미
    // ➍, ➎와 같이 사용할 때 *를 붙이면 그 포인터 변수가 가리키는 곳의 값을 의미
}

<예제의 실행 과정에 따른 메모리의 변화>

- ➊, ➋번 수행

주기억의

  • 주기억장치의 빈 공간 어딘가에 a라는 이름을 붙이고 그 곳에 50을 저장

- ➌번 수행

  • 변수 a의 주소가 b에 기억된다는 것은 b가 변수 a의 주소를 가리키고 있다는 의미

- ➍번 수행

  • b가 가리키는 곳의 값에 20을 더해 다시 b가 가리키는 곳에 저장
  • 그곳은 변수 a의 주소이므로 변수 a값도 저절로 변경되는 것

2. 포인터와 배열

  • 배열을 포인터 변수에 저장한 후 포인터를 이용해 배열의 요소에 접근할 수 있음
  • 배열 위치를 나타내는 첨자를 생략하고, 배열의 대표명만 지정하면 배열의 첫 번째 요소의 주소를 지정하는 것과 같음
  • 배열 요소에 대한 주소를 지정할 때는 일반 변수와 동일하게 & 연산자를 사용
  • 배열의 요소가 포인터인 포인터형 배열을 선언할 수 있음
  • 예제
main()
{
	int a[5]; //5개의 요소를 갖는 정수형 배열 a를 선언. 선언할 때 사용할 개수를 선언하고, 사용할 때는 첨자를 0부터 사용
    
    int i; //정수형 변수 i를 선언
    int *p; //➊
    for (i = 0; i < 5; i++) //반복 변수 i가 0에서 시작하여 1씩 증가하면서 5보다 작은 동안 ➋번을 반복수행
    	a[i] = i + 10; //➋
	p = a; //➌
    for (i = 0; i < 5; i++) //반복 변수 i가 0에서 시작하여 1씩 증가하면서 5보다 작은 동안 ➍번을 반복하여 수행
    	printf("%d", *(p+i)); //➍
}

- ➊ 

  • 정수형 변수가 저장된 곳의 주소를 기억할 정수형 포인터 변수 p를 선언

- ➋ 

  • 배열 a의  i번째에 i+10을 저장, i는 0~4까지 변하므로 배열 a에 저장된 값은 다음과 같음

- ➌

  • 배열명 a는 배열의 주소이므로 포인터 변수 p에는 배열 a의 시작 위치가 기억됨
  • 배열의 이름은 주소이므로 'p = &a'처럼 입력하지 않도록 주의

- ➍ 

  • p에 저장된 값은 정수형 배열의 시작 주소
  • p의 값을 1 증가 시킨다는 것은 현재 p가 가리키고 있는 정수형 자료의 주소에서 다음 정수형 자료의 주소로 가리키는 주소로 증가시킴을 의미
  • 정수형 자료의 크기는 4바이트이므로 다음 물리적 메모리의 주소는 4Byte 증가한 곳을 가리키는 것
  • p에 저장된 배열의 시작 주소에서 1번지씩, 즉 4Byte씩 증가시키는 것을 그림으로 표현하면 다음과 같음
  • p의 종류
    • p+0 : 배열의 시작주소에 0을 더했으므로 배열 시작의 주소인 '1000'번지 그대로
    • *(p+0) : '1000' 번지의 값은 10, 10을 출력
    • p+1 : '1000'에서 한 번지 증가한 주소는 '1004' 번지
    • *(p+1) : '1004' 번지의 값은 11, 11을 출력
    • p+2 : '1000'에서 두 번지 증가한 주소는 '1008'번지
    • *(p+2) : '1008'번지의 값은 12, 12를 출력