"/>

프로그래밍 기초-C언어 배우기(포인터).11

-처음부터 배우기-

포인터

포인터는 데이터가 저장된 메모리상의 주소를 말하며, 배열 이름이나 어떠한 값의 주소를 저장할 때 사용한다. 포인터 변수는 포인터를 저장할수 있는 변수이며, 포인터 변수를 이용하면 다른 변수의 값에 접근할 수 있다. 포인터 변수의 자료형은 포인터 변수가 가리키는 변수의 자료형과 같아야 한다.

포인터 변수

프로그램에서는 변수에 값을 쓰거나 읽기 위해 포인터 변수를 이용하는데 포인터를 이용한다.

아래의 코드를 직접 작성하고 실행해 보자.

1  #include <stdio.h>
2  main()
3  {
4  int *p;
5  int a;
6  scanf(“%d”,&a);
7  printf(“%d의 숫자 주소는: %d\n숫자를 다시 입력하세요:”,a ,&a);
8  scanf(“%d”,&a);
9  p = &a;
10 printf(“%d\n”, *p);
11 }

실행결과

위 프로그램을  실행하면 정수형 포인터 변수를 선언하고, 이 포인터 변수를 이용하여 다른 정수형 변수에 접근하여 그 값을 출력한다.

  • 4행은 정수형 포인터 변수를 선언하는 부분이다. 또한 ‘*변수 이름’ 의 형식으로 지정할 수 있다.
  • &a는 a의 값이 저장된 주소를 나타낸다.(예를들어 a의 주소가 0001이면 &a를 출력 했을 때 0001이 출력된다. )
  • 7행에서 a의 값 즉 10이 저장된 장소가 6356744이라는 것을 알수있다.
  • 9행에서 변수 a의 주소인 &a를 포인터 변수 p에 저장한다. 이렇게 하면 정수형 포인터 p는 변수a의 주소를 가지게 된다.
  • 10행에서 *p를 출력하는데 *p는 포인터 변수가 가리키는 주소에 저장된 값을 의미하므로 a에 저장된 값인 10이 출력된다.
  • 순서- 10입력 → a=10, &a=a의 주소 → a와 &a출력 → p=a의 주소(&a) → *p=a의 주소에 저장된 값 → 10출력

포인터 변수 선언의 기본 구조

자료형 *변수명; (예시 int *unm);

포인터 변수의 활용

배열의 원소에 접근하려면 배열 이름과 참조 번호를 이용해야 하지만 포인터를 이용하면 배열 이름을 사용하지 않고도 배열에 접근하여 데이터를 읽거나 쓸 수 있다.

아래의 코드를 직접 작성하고 실행해 보자.

1  #include <stdio.h>
2  main()
3  {
4  int *num,i;
5  int a[5]={100, 78, 95, 66, 96};
6  num=a;
7  for(i=0;i<5;i++)
8  printf(“%d “,a[i]);
9  printf(“\n”);
10 for(i=0;i<5;i++)
11 printf(“%d “,*(num+i));
12 printf(“\n”);
13 }

실행결과

위 프로그램을 실행하면 정수형 포인터 p를 이용하여 a[ ]배열의 모든 원소에 접근하여 배열에 저장된 값을 출력한다.

  • 6행에서 배열의 첫번째 요소가 사용하는 주소를 포인터 변수에 저장한다. 배열의 이름은 그 자체가 배열이 사용하는 첫번째 요소의 주소 값이므로 ‘&’연산자를 사용하지 않고도 직접 포인터 변수에 할당할 수 있다.
  • 7 ~ 8행은 배열 이름과 첨자 즉 [ ]를 이용하여 배열에 저장된 값을 출력한다.
  • 10 ~ 11행은 포인터를 이용하여 배열에 접근하는 과정으로 출력 결과는 같다.

아래의 코드와 같이 배열의 이름을 포인터처럼 사용해도 같은 결과가 출력된다.

int *a;
int b[5];

이렇게 정의된 두 변수에서, a와 b는 자료가 저장된 메모리의 공간을 가리킨다. 하지만 a는 변수이고 b는 상수로 정의 된다. 문자열을 가리킨다면 문자열의 첫 주소인 a를 기억하기 위한 공간을 따로 마련해 두고 저장하지만, b의 경우 그 공간 배정 없이 그냥 상수로 인식한다는 것이 배열과 포인터의 차이이고 배열의 이름은 포인터와 동일한 형태로 이용할 수 있으며, 포인터를 이용하여 배열과 동일한 형태로 사용할 수 있다. 즉, 배열의 이름은 일종의 포인터로 볼 수 있다. 

-이어서 공부하기-

 

댓글 남기기

Scroll Up