Visual Studio/C 기초

C언어 포인터(pointer)

낙락장송s 2012. 9. 3. 22:53

이번엔 아주아주 중요한 포인터에 대해 알아보겠습니다.

포인터에 대해

먼저, 변수에 선언된 값은 메모리에 저장됩니다. 그 저장된 값의 주소를 가리키는 것을 포인터라 합니다. 컴퓨터의 메모리는 아주 많은 저장 구역으로 구성되고 각각의 위치는 주소에 의해 구분됩니다. 메모리의 주소는 0부터 최대 메모리의 양 까지입니다.

프로그램 내에서 변수의 이름을 사용할 때 변수는 해당 메모리 영역을 자동으로 사용하게 되는데, 실제로 메모리 영역의 주소가 사용되는 것 이지만 프로그래머는 이런 사실을 깨닫지도 못합니다.

어느 변수(pnt)가 있다고 칩시다. 먼저 변수 pnt를 선언을 해봅시다.

int pnt;

그다음, pnt의 주소를 가리킬 포인터를 생성시킵니다.

int *thr;

포인터는 *를 붙여주면 됩니다.(포인터의 이름은 아무 거나 하셔도 됩니다. 그다음 포인터와 pnt 변수를 연결시켜 줍니다.

thr = &pnt;    // 연산자&를 연결시킬 변수 앞에 써주시면 됩니다.

printf("%d", pnt)

printf("%d", *thr)    //이 두 문장은 같은 결과를 나타냅니다.

변수의 이름을 통해 변수의 값을 사용하는 방법을 직접 사용이라고 하고, 변수에 대한 포인터를 통해 변수의 값을 사용하는 방법을 간접 사용이라 합니다.

int value = 1;
int *pnt;
pnt = &value;
 printf("직접사용의 value 값 : %d\n",value);
 printf("간접사용의 value 값 : %d\n",*pnt);

이 것이 직접사용과 간접사용의 예입니다. 컴파일 하고 실행하면 두 개의 값이 모두 1이 나옵니다.

포인터와 배열을 동시에

포인터와 배열을 동시에 사용하면 RAM의 구조에 대해 좀 더 쉽게 다가갈 수 있습니다. 그렇다면 주소 값을 계산하기 위해 주소연산자를 사용할 필요가 없는 지에 대해 의문이 생기는데요, 배열의 이름은 포인터 상수입니다. 프로그램이 실행되는 동안 배열으 ㅣ주소는 변경될 수 없고 고정된 값을 가지게 됩니다.

연속적인 배열 요소의 주소 값을 출력하는 프로그램을 만들어 보겠습니다.

 

#include <stdio.h>

main(void) {
int i[10], x;                                  //integer 형 배열을 선언하고 카운트할 변수 x를 선언합니다.
float f[10];                                   //float 형 배열을 선언합니다.
double q[10];                              //double 형 배열을 선언합니다.
 printf("\t\tInteger\t\tFloat\t\tDouble");
 printf("\n===============================");
 printf("============================");

 for(x=0;x<10;x++)
  printf("\n요소 %d:\t\t%d\t\t%d\t\t%d",x,&i[x],&f[x],&q[x]);

  printf("\n===============================");
 printf("============================\n");
}

   

 결과

 

여기에 저장된 값은 제 컴퓨터 RAM에 적힌 주소로서 사용자의 컴퓨터마다 다른 값이 나올 수 있습니다. 다음엔 포인터 연산에 대해 포스팅하겠습니다.


추천은 블로거에게 큰 힘이 됩니다