이 노트는 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()
{
intimsi;
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 -o1_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를 읽어오게되는 것이다.
'C언어' 카테고리의 다른 글
Chapter 6. scanf()와 fgets() (0) | 2011.10.16 |
---|---|
Chapter 2. 1차원 배열과 포인터 (0) | 2011.10.16 |
Chapter 3. 2차원 배열과 포인터 (0) | 2011.10.16 |
실행결과 (0) | 2011.10.16 |
문자열관련 예제 (0) | 2011.10.16 |