글
(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 |