삽질의 현장/- C

곱씹어보자 C!_#022_삽잡이의 두서없이 막말하는 구조체 예시_둘

shovelman 2015. 6. 28. 20:54

안녕하세요 삽잡이입니다.

구조체 예시 두번째 시간입니다...


지난시간에 이어 예시를 살펴보는데 어때요 재미있죠...

아하하하하하하하하 정줄 놓지 않았습니다.... 

죄송합니다... C부려보도록 하겠습니다... 푸하하


이번시간도 마찬가지로 지난 시간부터 주구장창 사용하는

요놈... 를 꾸준히 사용하며 설명을 진행해보도록 하겠습니다.

안녕~~~


1
2
3
4
5
6
typedef struct _Point 
{
    int x;
    int y;
}Point;
 
cs


구조체에서는 오직 딱 하나 '대입' 만이 가능합니다.

다른거 안되요... 같은 타입인 경우 대입 즉, 복사가 가능합니다. 

이를 메모리 덤프라고도 하죠...

이렇게 가능합니다...


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
void PrintPoint(Point ps[])
{
    printf("(%d, %d)\n", ps->x, ps->y);
}
 
void main()
{
    Point p1 = { 23 };
    Point p2 = { 45 };
    Point p3;
 
    p3 = p1;
    PrintPoint(&p3);
 
    p3 = p2;
    PrintPoint(&p3);
}
cs


구조체에 가능한 연산... 바로 대입이라고 했죠...


코드를 보시면 p3라는 Point형 구조체 변수는 아무것도 초기화가 되어있지 않군요...


p3에 p1을 대입하고 출력하고

다시 p3에 p2를 대입하고 출력하는 형식의 코드군요...

결과는 p3는 p1이 대입됬을 때 p1의 값이 즉, (2,3)이 출력되고

그 다음 p2의 값 (4,5)가 출력됩니다.

그렇습니다. 대입이 됩니다...


다른 연산자들 혹시 해보실래요!? 더하기를 생각해볼까요?


1
2
3
4
5
Point p1 = {2,3};
Point p2 = {5,5};
Point p3;
 
p3 = p1+p2; 
cs


Point 라는 놈의 구조체 내부에는 int형 x와 y라는 변수가 정의되어 있었습니다.

컴파일러는 똑똑한 친구이지만... C언어에서는... 이건 안되요...

알아서 딱딱 

p1.x, + p2.x 와 p1.y + p2.y  이렇게 해주지 않습니다...


그렇다면 어떻게 연산을 해야될까요?


1
2
pt3.x = p1.x+p2.x;
pt3.y = p1.y+p2.y;
cs


이런식으로 해야겠죠...


자 다음으로는, 동적 메모리를 구조체에 할당해보는 놀이를 해봅시다.
우선 동적 메모리를 받은 변수는... 일반 방법처럼 초기화를 할 수 없습니다.


1
2
Point* p = (Point*)malloc(sizeof(Point));
*= { 12 };
cs


이렇게 못한다는 것이죠...

따라서, 초기화를 위해 따로 초기화를 따로 해주는 함수를 만들어 보도록 합시다...


1
2
3
4
5
6
7
8
9
10
11
12
13
14
void SetPoint(Point* ps, int x, int y)
{
    ps->= x;
    ps->= y;
}
 
void main()
{
    Point* p = (Point*)malloc(sizeof(Point));
    SetPoint(p, 12);
 
    printf("%d, %d\n", p->x, p->y);
    free(p);
}
cs


이렇게 초기화를 할 수 있겠군요...

잊으면 안되시는 것은... 동적 메모리를 다 쓴 다음에는 반드시 제거를~!


아 재미있다~!