본문 바로가기
OLD/[C]정리중

[개탱][C][구조체]

by 개탱 2018. 1. 2.
728x90

구조체 :: 서로 밀접한 연관이 있는 data들을 묶어놓은 틀


1
2
3
4
5
6
7
8
9
10
11
12
typedef struct stack
{
    int s[100];
    int top;
}STACK; // 이것은 구조체를 선언한 것. 정의X 선언O
 
int main()
{
 
    STACK t_Stack; // 이것은 정의 !
 
cs


1
2
3
4
5
typedef struct stack
{
    int s[100]; // field , member
    int top;
}STACK; // 이것은 구조체를 선언한 것. 정의X 선언O
cs

구조체 안의 s[100]과 같은 것들에 대하여 stack 구조체의 field 또는 member 라고도 부른다.


1
2
3
4
5
6
7
8
9
10
11
12
typedef struct stack
{
    int s[100];
    int top;
}STACK; // 이것은 구조체를 선언한 것. 정의X 선언O
 
int main(){
    STACK s1;
    STACK s2;
    s1.top = -1;
    s2.top = -1;
}
cs


구조체 내부의 멤버에 접근하기위해서 '.' 를 사용하여

s1.top = s1의 top 라는 의미로 해석한다.


1
2
3
4
5
6
7
8
int main(){
 
    STACK s1;
    STACK *s2;
    s2 = &s1;
    s1.top = -1;
    s2->top = 1;
cs


만약 구조체 변수가 '*'(포인터) 로 정의되어 있는경우 '.' 이 아닌 '->'를 사용하여 멤버에 접글을 한다.

s2->top = s2가 가르키고 있는것의 top 라고 해석한다.

위의 코드가 진행이되면 s2 는 s1을 가리키고 있기때문에
s2->top = 1; 코드를 만나면서 s2가 가리키고 있는 s1의 top 멤버의 값을 1로 바꾸기때문에
s1.top 의 값이 1로 변경이된다.


​구조체는 보통 POINTER 로 넘겨준다 . 
함수에서 호출하고 할 때 Call by value 로 호출을 하면
계속 복사를 해야되서 복사를 하는 메모리도 필요하고, 복사를 하는 시간도 걸리기때문에
보통 C프로그래밍 개발자들은 모두다 pointer 로 넘겨준다.


구조체의 '.' 과 '->' 를 이용한 간단한 코드
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
#include<cstdio>
#include<cstring>
 
typedef struct stack
{
    int s[100];
    int top;
}STACK; // 이것은 구조체를 선언한 것. 정의X 선언O
// 선언 :: declaration
// 정의 :: definition
 
void push(STACK* s, int data);
int pop(STACK* s);
int main(){
 
    STACK s1;
    STACK s2;
    s1.top = -1;
    s2.top = -1;
 
    push(&s1,100);
    push(&s1,200);
    push(&s1,300);
    int x = pop(&s1);
    x = pop(&s1);
    push(&s1,400);
    x = pop(&s1);
    x = pop(&s1);
 
    printf(" x  = %d\n",x);
 
    push(&s2,10);
    push(&s2,20);
    x = pop(&s2);
    printf(" x = %d\n",x);
 
void push(STACK *s, int data){
    s->top = s->top+1;
    s->s[s->top] = data;
}
int pop(STACK *s){
    s->top = s->top -1;
    return s->s[s->top+1];
}
 
cs


댓글