포인터 정리 1일차

// 2월 4일 수업 내용 정리
1. 포인터의 등장 배경

/*
    포인터를 사용하지 않은 경우     
    i의 값을 20으로 변경하고 단순히 출력하는 예제
*/
void main() 
{
    int i =10;
    i = 20; // 
    printf("%d\n", i);    
}

위의 코드를 포인터를 쓰도록 변경한다.

/*
    포인터를 사용하는 경우
    문제점
    1. 메모리를 낭비한다.
        - 이전 소스인 int만 사용하는 경우에는 4Byte -> 포인터 8Byte
    2. 속도가 느리다.
        - Assembly 코드에서 연산이 늘어나기 때문에 느리다.
*/


void main()
{
    int i=10;
    int *p = &i; // i의 주소값을 넘긴다.
    *p = 20;
    printf("%d\n", i);
}

그렇다면 메모리 사용량도 많고 속도도 느린 포인터를 왜 사용해야 하는가?

/*


    문제가 많은 포인터를 사용해야 하는 이유
    모든 소스를 메인 함수에만 작성하는 것은 아니다.
    메인 함수에는 자료구조를 그리고 알고리즘 부분은 함수로 작성한다.
    1번 예제에서 메인 함수에 선언된 i의 값을 다른 함수에서 
    변경할 수 있는가?
    기본적으로는 불가능 하다. 지역변수는 사용할 수 있는 범위가
    지정되어 있기 때문이다.
    만약

    foo() 
    {
        int i;
        i = 20; 
    }


    위와 같이 변경 하게 되면 다른 지역 변수를 변경하게 된다.(main변경X)
    int i;
    void foo()
    {
        i = 20; 
    }
    main()
    {
        int i = 10;
        foo();
        printf("%d\n", i); 
    }
    위의 코드를 실행하게 되면 10이 출력된다.
    {} 안에서 컴파일러는 i에 해당하는 지역변수를 먼저 찾고
    지역변수가 없다면 전역 변수를 찾게 된다.
    그러므로 main변경 X     
    그렇기 때문에 메모리를 더 사용하고 속도도 느린 포인터를
    사용하게 되는 것이다.(모듈화 때문)
*/

#if 1
void foo(int *p) 
{
    *p = 20;
}

void main()
{
    int i=10;    
    foo(&i);
    printf("%d\n", i);
}

#endif

포인터를 사용함에 있어 중요하게 생각해야 하는 부분은 대상체의 크기 이다.

/*
    포인터를 사용하는데 있어 반드시 생각해야 할 것
    포인터는 주소값을 저장하는 것이다.
    포인터 = 4Byte(주소값)    
    포인터 + 1 = 포인터 + (대상체의 사이즈 * n)
    대상체의 크기를 int 는 4Byte , Char 는 1byte 로 생성된다.
*/


#if 1
// 포인터 대상체 사이즈 확인
void main()
{
    double i=10;    
    double *p = &i;
    printf("double size = %d\n",sizeof(double));    
    printf("p size = %d\n", sizeof(p));                // 포인터의 크기
    printf("p+1 size = %d\n", sizeof(p+1));            // 포인터의 크기
    printf("*(p+1) size = %d\n", sizeof(*(p+1)));    // 대상체의 크기
}
#endif







/*
    포인터를 이용하여 Little Endian 또는 Big Endian 을 찾는 방법
    int에 대한 타입을 char * 타입으로 강제 치환 하게 되면 3Byte는
    잘리고 남은 1Byte만 출력되게 된다. little endian 인 경우 
    뒤에 1Byte가 출력되고 Big Endian 은 앞에 1Byte가 출력된다.
*/


main() 
{
    int i = 0x12345678;
    char *p = (char*)&i; // 강제로 치환하면서 3Byte를 버린다.
    printf("%x\n", *p); // OUput => 78
}

포인터 또는 배열을 영어로 말하면?

/*
    int a[5] => array of 5 int
    int *p    => pointer to int
    int * foo(void) => function returnning pointer to int

    2차원 배열
    2차원 배열을 논리적으로는 2차원 이지만 물리적으로는 1차원이다.
    int a[2][2] =>  int 4 Byte * 4 => 16Byte
    int a[0] => int 4 Byte * 2 = > 8Byte
*/


main() 
{
    int a[2][3] = {{1,2,3}, {3,4,5}};
    printf("%d\n", sizeof(a));
    printf("%d\n", sizeof(int[2][3]));
    printf("%d\n", sizeof(a) / sizeof(a[0])); // 행의 갯수    
}
이 글은 C 카테고리로 분류되었고 님에 의해 에 작성됐습니다.

답글 남기기

아래 항목을 채우거나 오른쪽 아이콘 중 하나를 클릭하여 로그 인 하세요:

WordPress.com 로고

WordPress.com의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Twitter 사진

Twitter의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Facebook 사진

Facebook의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

%s에 연결하는 중