- Secret is...
- Study
- Programming
스프링노트 : http://icreater.springnote.com/pages/170024
C언어 포인터
※ 이 노트는 다시 체계적으로 배우는 C언어 포인터를 공부하면서 정리하기위함입니다.
이 노트는 C언어 포인터를 공부하는 모든 사람이 서로 정보를 공유하고 업데이트할 수 있습니다.(공부하면서 같이 다듬어 가실분은 언제든지 환영^^;;)
따라서, 포인터를 공부하는 모든 이에게 도움이 되었으면 합니다.
Chapter 1. 포인터의 기초
포인터란
포인터는 메모리의 위치를 표현한 기호.
포인터 변수는 포인터를 저장할 수 있는 변수. 즉, 특정한 문자나 상수 값, 문자열이 들어가는 것이 아니라 번지가 들어감.
포인터 변수는 번지 이외에는 어떠한 것도 들어갈 수 없다!!!
정의 : int *imsip;
쓰레기주소값
int *imsip 처럼 변수를 사용할 수 있도록 메모리의 특정 영역 4바이트가 선언되었고 초기화가 되지 않은 상태이므로 쓰레기 값이 들어가 있음.
1_1.c
#include <stdio.h>
mai()
{
int *imsip;
printf("*imsip[%p]\n", imsip);
}
gcc -o 1_1 1_1.c
./1_1
*imsi[dfbf137f]
& 연산자
앤드연산자, 번지 연산자 부르며 어떤 변수가 저장된 곳의 선두 번지를 뜻함.
포인트 변수에 주소 값을 할당하기 위해서는 & 연산자를 사용해야 함.
1_2.c
#include <stdio.h>
main()
{
int imsi = 5;
printf("imsi[%d]\n", imsi);
printf("&imsi[%#010x]\n", &imsi);
}
gcc -o 1_2 1_2.c
./1_2
imsi[5]
&imsi[0x8047d24]
포인터 변수에 번지 할당
'*' 연산자는 포인터 변수에 저장된 선두 번지를 참조하여 저장된 값을 취함.
정의할 때 사용된 '*' 는 번지를 저장 할 수 있는 변수를 할당 받는 것이고, 수식 내에서 사용된 '*'는 변수에 대한 역참조(dereferencing)를 하겠다는 것.
"Segmentation Falut" 메시지가 나온다면 "다른 프로그래이 사용하고 있는 메모리 영역을 건드렸다"는 의미.
int imsi = 5;
int *imsip; <-- 번지 저장 변수 할당
imsip = &imsi; <-- imsi가 저장된 곳의 번지를 뜻함.
*imsip = imsi; <-- '*' 역참조 연산자
printf("%p\n", &imsi); <-- imsi의 주소값 : 0xbfbdf6ac
printf("%p\n", &*imsip); <-- *imsip의 주소값 : 0xbfbdf6ac
printf("*imsip[%d]\n", *imsip); <-- imsi에 저장된 값 : 5
1_7.c
#include <stdio.h>
main()
{
int imsi;
int *imsip;
imsip = &imsi;
*imsip = 1024;
printf("%d\n", *imsip);
*imsip = *imsip + *imsip; <-- *imsip는 변수처럼 사용할 수 있기 때문에 이와같은 수식이 가능
printf("%d\n", *imsip);
}
gcc -o 1_7 1_7.c
./1_7
1024
2048
포인터 변수에 타입 지정
포인터 변수는 항상 4byte가 할당된다.
1_9.c
#include <stdio.h>
main()
{
int int_;
float float_;
double double_;
char char_;
int *intp;
float *floatp;
double *doublep;
char *charp;
printf("int[%d] float[%d] double[%d] char[%d]\n",
sizeof(int),
sizeof(float),
sizeof(double),
sizeof(char));
printf("intp[%d] float[%d] double[%d] char[%d]\n",
sizeof(intp),
sizeof(floatp),
sizeof(doublep),
sizeof(charp));
}
gcc -o 1_9 1_9.c
./1_9
int[4] float[4] double[8] char[1]
intp[4] float[4] double[4] char[4]
포인터 변수에 type이 필요한 이유는 모두 4byte로 할당이 되지만,
할당된 포인터 변수가 가리키는 번지로 가서 몇 byte 읽어 오는가에 대해 정의 하기 위한 것이다.
즉, int *intp 와 double *doublep 가 각각 선언됭 있다면 이는 intp는 4byte를 읽어오고 doublep는 8btype를 읽어오게 되는 것이다.
- [2012/03/01] 08년 윤중로 벚꽃 (473)
삶이란 자신을 망치는 것과 싸우는 일이다
마음을 폐가로 만드는 모든 것과 싸운다
- 신현림 詩 '나의 싸움' 중에서...