관리 메뉴

IT 컴퓨터공학 자료실

초급편 7. 구조체와 포인터 본문

컴퓨터공학/포인터

초급편 7. 구조체와 포인터

윤맨1 2015. 6. 30. 11:09

                                            포인터 토대가 된 책

                                              구조체와 포인터

포인터와 구조체와 복합되어 사용되는 경우가 매우 많다. 왜냐하면 구조는 복합 데이터를 구조화하는 수단이며, 따라서 큰 경향이다. 하청 함수에 구조체의 정보를 전달하고자 할 때에는 구조체를 값으로 전달하고 모든 복사하여 전달보다 참조 내게 한 것이 더 효율적이다. 보기 구조체와 배열은 비슷하지만 배열은 배열 이름이 포인터로 해석되었지만 구조가 그런 것은 아니다. 그래서 구조체를 참조로 전달하는 경우에는 처음에는주의해야한다.

struct S {
        char name [10];
        int type;
};

void sub (struct S * s)
{
.........
}

void main ()
{
        struct S a1;

        sub (& a1);
}

특히 라이브러리 함수를 사용할 때주의해야한다. 라이브러리 함수 memset (void * adrs, int c, int num)는 지정된 메모리에서 지정한 양의 바이트 수를 지정 문자로 채운다.

        char str [10];
        memset (str, 0, 10);

이 구조체하면 다음과 같다.

        struct S a1;
        memset (& a1, 0, sizeof (struct S));

또한 구조체를 이용한 응용 예로서 목록 구조를들 수있다. 목록 구조는 매우 필수적인 데이터 구조의 하나이며, 응용 범위가 매우 넓다. 이 목록 구조에 익숙 할 C 언어 초급 졸업 시험이라고해도 과언이 아니다.

목록 구조는 자기 참조 구조체라는 구조에 의해 정의된다.

struct List {
        int data;
        struct List * next;
};

이 선언에서 struct List를 정의하고있는 가운데, strut List를 사용하는 것은 모순 된 것이 아닌가라고 생각할지도 모른다. 그러나 내부 struct List는 실제로 포인터이며, 포인터의 크기는 int와 같은이기 때문에, struct List의 크기는 int2 개의 분, 32byte가 계산할 수있다. 그래서 결코 모순되는 것은 아니다.

구조체의 경우 간접 참조는 화살 연산자 '->'에 의해 이루어진다. 이것은 간접 참조 연산자 '*'의 우선 순위가 낮기 때문에 구조체 포인터 l 회원 data를 참조하기 위해 * l.data이라고 l.data가 포인터로 해석되고, 그것은 를 간접 참조하려고하기 때문에 의미 론적 오류된다. 잘못된 포인터 l을 사용하여 참조하기 위해서는 (* l) .data 할 필요가 있지만, 입력되기 어렵 기 때문에 l-> data라는 표기법을 인정 받고있다. 실질적으로는 (* l) .data와 l-> data 사이에 구별은 없다.

목록 구조의 예는 다음 에나 실례로로하자. 대개의 참고 문헌 목록 구조의 예이 붙어있는 것이다.

그리고, 당연한 일이지만, 구조체 멤버의 주소를 얻을 수도있다.

        struct List * next;
        struct List top;
        struct List second, third;
        int * d;
        
        top-> next = & second;
        d = & top.data; / * 일반적으로 & 연산자를 사용하면된다 * /
        * next = & third;
        * d = 999; 

이때 주소 연산자의 결합 우선 순위는 도트 연산자의 그것보다 낮기 때문에 특히 괄호를 사용하거나하지 않는 것이 보통이다.

'컴퓨터공학 > 포인터' 카테고리의 다른 글

초급편 9. 이진수  (0) 2015.06.30
초급편 8. 리스트 구조  (0) 2015.06.30
초급편 6. 함수 호출 방법  (0) 2015.06.30
초급편 5. 포인터의 형태  (0) 2015.06.30
초급편 4. 주소 가져오기  (0) 2015.06.30