(9-1)struct

C/C언어 이론 2018. 10. 3. 18:58
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
// 구조체 안에 구조체
// 매개변수로 사용
 
#include <stdio.h>
 
typedef struct _POINT
{
    int x;
    int y;
} POINT;
 
// 구조체 안에 다른 구조체를 멤버로 가지려면, 그 구조체가 더 위에 미리 선언되어야 한다.
typedef struct _CIRCLE
{
    POINT    sPoint;    // 좌표 (원점)
    int        iLen;    // 반지름
} CIRCLE;
 
// [선언]
void SetCircleVal( CIRCLE sCircle );
void SetCircleRef( CIRCLE * pCircle ); // CIRCLE 타입 변수의 주소 값을 전달 받겠다! (포인터변수)
 
void main()
{
    POINT sPoint = {0 , }; // POINT가 CIRCLE에 있다고해서 사용 못하는게 아님~~ 전혀 상관없음
    CIRCLE c1 = {0, }; // 단지, CIRCLE 안에 POINT가 있을 뿐
    CIRCLE c2 = {0, };
    CIRCLE c3 = {0, };
 
    printf("c1의 크기 : %d\n"sizeof(c1));
 
    // 구조체의 멤버가 구조체일 때 또 점(.)을 찍고 접근한다.
    printf("c1 좌표 : (%d,%d), 반지름 : %d\n", c1.sPoint.x, c1.sPoint.y, c1.iLen);
    
    SetCircleVal( c1 ); // c1의 값만 전달했기 때문에 함수 수행 후 c1은 변화가 없다 (call by value)
 
    printf("c1 좌표 : (%d,%d), 반지름 : %d\n", c1.sPoint.x, c1.sPoint.y, c1.iLen);
 
    SetCircleRef( &c1 ); // 매개변수가 포인터변수라 c1의 주소값을 전달했다!
    printf("c1 좌표 : (%d,%d), 반지름 : %d\n", c1.sPoint.x, c1.sPoint.y, c1.iLen);
 
 
    // 구조체 변수의 값 복사
    c2.iLen = c1.iLen;
    c2.sPoint.x = c1.sPoint.x;
    c2.sPoint.y = c1.sPoint.y;
    // 멤버 하나씩 복사
 
    c3 = c1; // 편함! --> 자료형이 같기 때문에 가능 , int a, b;   a = b;
 
    // if( c1 == c3 ) {} 불가능! : 우리가 정의한 자료형이기 때문에 어떻게 비교할지 모른다..
    // if(a == b) { } 가능! int라고 가정, int 변수끼리는 비교가 가능 (이미 만들어져있음)
}
 
 
// SetCircleVal 사용 시 호출할 때마다 12byte 공간이 생성 (매개변수 타입이 CIRCLE = 12byte)
//    > 구조체의 크기가 크면 그 크기만큼 생성 (충분히 가능성이 있는 이야기)
//    > 많이 호출 할 수록 프로그램이 힘들어한다.
// SetCircleRef 사용 시 호출할 때마다 4byte 공간이 생성 (매개변수가 포인터 = 4byte)
//    > 구조체의 크기랑 상관없이 무조건 4byte
 
// 가급적이면 구조체를 함수에서 다룰 땐, 포인터 변수로 다룬다! (크기 때문에 비효율적일 수 있음)
 
 
 
// [정의]
void SetCircleVal( CIRCLE sCircle ) // 함수 호출 시 12byte짜리 CIRCLE 공간이 새로 생성
{                                    // 호출 시 전달한 c1 의 값이 통째로 복사
    sCircle.sPoint.x = 3;
    sCircle.sPoint.y = 4;
    sCircle.iLen = 5;
}
 
void SetCircleRef( CIRCLE * pCircle )
{
    // pCircle은 구조체의 포인터 변수 : 해당 주소의 멤버 접근 시  ->  사용
    // 멤버를 접근했더니 sPoint가 있다. 포인터 변수가 아님(일반 구조체 변수)  점(.) 사용
    pCircle->sPoint.x    = 5;
    pCircle->sPoint.y    = 6;
    pCircle->iLen        = 10;
}
cs



'C > C언어 이론' 카테고리의 다른 글

(9-2)struct  (0) 2018.10.03
(8-4)Pointer  (0) 2018.10.03
(8-3)Pointer  (0) 2018.10.03
(8-2)Pointer  (0) 2018.10.03
(8-1)Pointer  (0) 2018.10.03

설정

트랙백

댓글