ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • C언어_12장
    Computer Sci‧ence/C 2014. 2. 17. 12:47
    반응형

    변수가 저장되어 있는 주소가 있고, 이 주소 값 역시 정수이므로 변수에 저장하는 것이 가능하다. 즉, 적절한 형태의 변수를 선언해서 저장할 수 있다. 이러한 목적으로 선언되는 변수를 가리켜 포인터라 한다. 


    "포인터란 메모리의 주소 값을 저장하기 위한 변수이다." 


    포인터란 기본자료형 변수와 달리 "메모리 공간의 주소 값을 저장" 하는데 사용되는 변수를 말하는 것이다. 그래서 흔히 포인터가 변수라는 것을 강조하기 위해서 '포인터 변수' 라는 표현을 쓰는 것이다. 

    포인터는 다른 변수의 주소를 값으로 지닌다. 

    컴퓨터의 주소 체계는 4바이트로 표현된다. 

    **"포인터 (PN)이 변수 n을 가리킨다" 라고 표현한다. 여기서 가리킨다는 의미는 주소 값을 지니고 있다는 뜻이다. 


    1. 포인터를 선언하는 방법, 포인터를 선언하고 초기화 하지 않으면 쓰레기 값이 된다. 
      포이터에도 
       int *a;
      char *b;
      double *c;

    2. 주소값을 참조할 때 사용하는 연산자: &연산자
      int a=2005;
      int* pA =&a; //변수 a의 주소 값을 반환하라 라는 의미, 주소 값을 구할 때 사용하는 연산자이다. 

    3. 포인터가 가리키는 메모리 참조: * 연산자
      * 연산자를 포인터 변수 앞에 붙이게 되면, 포인터가 가리키는 메모리 공간에 존재하는 값을 참조하라 라는 의미이다. 
      int a= 2005;
      int *pA=&a;
      printf("%d", pA); 
      printf("%d", *pA); //2005 출력.
      ------------------------------------------------------------
      예제
      ------------------------------------------------------------

    #include <stdio.h>


    int main(void)

    {

    int a = 2005;

    int* pA=&a;


    printf("pA: %d\n", pA);

    printf("&a=%d\n", &a);


    (*pA)++; //a++와 같은 값을 지닌다.
            **괄호로 표시를 하지 않으면 결과값

    이 원치 않게 나온다. 

    printf("a: %d\n", a);

    printf("*pA: %d\n", *pA);

    return 0;






    1. 포인터가 가리키는 메모리 참조: * 연산자(*pA++) vs. (*pA)++;
      * 연산자보다 ++ 연산자의 우선 순위가 높기 때문에 괄호를 반드시 해야 한다. 그렇지 않으면 엉뚱한 결과를 얻게 된다. 

    2. 포인터의 접근 방식
      직접접근(Direct Access): a 라는 변수를 통한 접근
      간접접근(Indirect Access): pA라는 포인터 변수를 통한 접근

    3. 포인터에 타입이 존재하는 이유

    int a = 10;

    int* pA=&a;


    double e = 3.15;

    double *pE = &e;



    printf("%d %f\n",*pA,*pE); //포인터에 타입이라는 것이 존재하지 않는다면, 포인터를 이용해서 변수를 참조하는 경우 몇 바이트를 읽어들여야 할 지 알 수 없게 된다. 포인터의 타입은 메모리를 참조하는 방법을 알려주는 역할을 한다. 



    --------------------------------------------------

    연습문제 12-1

    --------------------------------------------------

    int n = 10;

    int* p1=&n;

    int* p2 = p1;


    printf("%d \n",(*p1)++); //10 출력후 ++

    printf("%d \n",(*p2)++); //11 출력후 ++

    printf("%d \n",n); //++된 값의 출력

    --------------------------------------------------

    연습문제 12-2

    --------------------------------------------------

    char a='A';

    char *pA=&a;


    int b=10;

    int *pB=&b;


    float c=1.01;

    float *pC=&c;


    double d=3.14;

    double *pD=&d;

    (*pA)++;

    (*pB)++;

    (*pC)++; 

    (*pD)++;


    printf("%c\n%d\n%f\n%f\n", a,b,c,d);

    --------------------------------------------------

    연습문제 12-3 (간접접근으로 서루의 값을 바꾸어 주는 예제) 

    --------------------------------------------------


    int a=10;

    int *p1=&a;


    int b=20;

    int *p2=&b;


    int *p3;


    (*p1)--;

    (*p2)--;

    printf("%d %d\n", *p1, *p2);


    p3 = p2;

    p2 = p1;

    p1 = p3;

    printf("%d %d\n", *p1,*p2);


    잘못된 포인터의 사용 

    **

    1. 예 1)

    int main(void)

    int *pA;       //포인터를 선언만 하고 초기화를 하지 않으면 어디를 가르킬지 모른다

    *pA=10;      //상수의 값을 입력하면 포인터가 다른 곳의 값을 가르치게 된다. 이 경우에는 프로그램 오류를 발생시킬 수 있다. 


    2. 예 2)

    int main(void)

    int *pA=100; //선언과 동시에 초기화를 시키라고 해서 초기화를 하면 오류가 발생한다. 

    *pA=10;


    이번장에서 공부한 내용 정리

    1. 포인터의 개념에 대해서 살펴보았다. 

    2. 포인터를 선언하는 방법과 포인터에 관련된 연산자(&,*)의 기능에 대해서 살펴보았다. 

    3. 포인터에도 타입이 있는 이유에 대해서 이야기하였다. 결론은 메모리 공간을 참조하는 방법을 결정짓기 위해서라고 이야기 하였다. 즉 * 연산자와 관계 있는 것이다. 

    4. 포인터가 잘못 사용된 예 두가지를 소개하였다. 의외로 이러한 형태의 실수를 많이 범한다. 





    반응형

    'Computer Sci‧ence > C' 카테고리의 다른 글

    C언어_11장  (0) 2014.02.17
    C언어_10장  (0) 2014.02.14
    C언어_09장  (0) 2014.02.13
    scanf vs. scanf_s "_CRT_SECURE_NO_WARNINGS"  (0) 2014.02.13
    백견이 불여일타요 백타가 불여일작이다!  (0) 2014.02.12

    댓글

Designed by Tistory.