포인터 변수

Programming/C 2006. 10. 23. 17:57
포인터

포인터는 번지에 대한 기호화된 표현을 말한다.

int imsi;

imsi라는 변수를 정의한 문장을 만나면 시스템은 imsi에 대하여 4바이트의 메모리를 할당한다.
시스템이 할당해 준 4바이트는 다른 프로세스들이 할당받지 못하므로 안전하게 사용할 수 있다.
4바이트는 모두 번지라고 하는 이름을 가지고 있고, 일반적으로 4바이트 형식으로 표현된다.

int imsi (4byte)
1byte : 0x8047c70
1byte : 0x8047c71
1byte : 0x8047c72
1byte : 0x8047c73

결국 포인터라는 것은 메모리의 위치를 표현한 기호인 것이다.


포인터 변수

포인터 변수는 포인터를 저장할 수 있는 변수를 말한다.
이 말은 메모리의 특정 위치를 저장한다는 말과 같다.
포인터 변수에는 번지 이외에는 그 어떤 것도 들어갈 수 없다.

int *imsip;

imsip라는 정수형 변수에 *을 붙였다.
imsip는 정수를 저장하는 곳이 아니라, 정수가 저장된 곳의 위치을 기억하게 된다.
포인터 변수 imsip에는 오로지 번지만 들어갈 수 있으므로 숫자나 문자열 등을 할당할 수 없다.

main() {
  int *imsip;

  printf( "%p\n", imsip );  // imsip 에 저장된 값 출력
  printf( "%p\n", &imsip );  // imsip 가 할당된 메모리 주소 출력 (0x8047c64 등의..)
}


& 연산자

포인터 변수에 번지 값을 저장하기 위해 '&' 연산자가 필요하다.
&는 '앤드 연산자', '번지 연산자' 하고 하며, 어떤 변수가 저장된 곳의 선두 번지를 뜻한다.

#include <stdio.h>

main() {
  int imsi = 5;

  printf( "imsi[ %d]\n", imsi );
  printf( "&imsi[ %#010x]\n", &imsi );
}
// output
imsi[ 5]
&imsi[ 0x8047d24]


포인터 변수에 번지 할당

#include <stdio.h>

main() {
  int imsi;
  int *imsip;

  imsip = &imsi;
}

imsip 라는 포인터 변수에 imsi 가 저장된 곳의 주소를 넣고 있다.
& 연산자가 특정 변수의 선두 번지를 뜻한다면, * 연산자는 포인터 변수에 저장된 선두 번지를 참조하여 하나의 값을 취한다.

#include <stdio.h>

main() {
  int imsi = 5;
  int *imsip;

  imsip = &imsi;
  printf( "*imsip[ %d]\n", *imsip );
}
// output
*imsip[ 5]
&imsi == imsip == &*imsip
.
#include <stdio.h>

main() {
  int imsi = 5;
  int *imsip;

  imsip = &imsi;
  *imsip = imsi;  // * 역참조 연산자 (deferencing operator)
  printf( "imsip[ %#010x] *imsip[ %d]\n", imsip, *imsip );
}
// output
imsip[ 0x8047d24] *imsip[ 5]
.
#include <stdio.h>

main() {
  int imsi = 5;
  int *imsip;

  imsip = &imsi;
  *imsip = *imsip + *imsip;
  printf( "%d\n", *imsip );  // output: 10
  printf( "%d\n", imsi );  // output: 10
}


포인터 변수 타입

int  *intp;
float  *floatp;
double  *doublep;
char  *charp;

포인터 변수 타입은 메모리에 4바이트가 할당된다.
그렇다면 위와 같은 포인터 변수에 왜 타입이 필요한가?
포인터 변수의 타입은 변수가 가리키는 곳으로 번지로 가서 몇 바이트를 읽어오는가에 대한 답을 주는 것이다.

WRITTEN BY
손가락귀신
정신 못차리면, 벌 받는다.

트랙백  0 , 댓글  1개가 달렸습니다.
  1. 위 출력양식 '%#010x' 에서 '#'는 출력시 16진수임을 알리기 위해 '0x'를 붙이라는 말임.
secret