본문 바로가기

C언어

Chapter 1. 포인터의 기초

※ 이 노트는 다시 체계적으로 배우는 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()

{

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