• http://www.secret.pe.kr/19250
  • http://www.secret.pe.kr/5186
  • http://www.secret.pe.kr/19223
  • http://www.secret.pe.kr/5249
  • http://www.secret.pe.kr/4975
  • http://www.secret.pe.kr/19218

2012.05
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31    







[레벨:30]시크리트
조회 수 : 4271
2008.11.07 (09:54:52)

스프링노트 : 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를 읽어오게 되는 것이다.



이 글의 테그에 포함되는 게시물 목록
  1. [2012/03/01] 08년 윤중로 벚꽃 by 시크리트 (473)
profile


삶이란 자신을 망치는 것과 싸우는 일이다
마음을 폐가로 만드는 모든 것과 싸운다

- 신현림 詩 '나의 싸움' 중에서...
문서 첨부 제한 : 0Byte/ 2.00MB
파일 제한 크기 : 2.00MB (허용 확장자 : *.*)
Tag List