-

c언어 구조체 고급

Patti Smith 2021. 11. 22.



struct student {
      int id;
      int midterm;
      int final;
};


구조체 포인터
struct stdent aStudent;
struct student *sp = &aStudent;

-> 연산자 : *연산자 + .연산자
(이때 .연산자가 *연산자보다 순위가 높아서 괄호 꼭 써줘야 함)
(*sp).id = 1001;    // sp->id=1001;
(*sp).midterm = 90; // sp->midterm=90;
(*sp).final=80 // sp->final=90;


1. 입력
scanf("%d", &sp->id);
scanf("%d", &sp->midterm);
scanf("%d", &sp->final);

2.출력
printf("학번: %d 중간: %d 학기말: %d\n",sp->id, sp->midterm, sp->final);

구조체 배열과 구조체 포인터

struct student sList[3];

struct student *sp = &sList[0];  ==
struct student *sp = sList;

printf("%d",sp->id);
printf("%d",sp->midterm);
printf("%d",sp->final);

sp++;  // (sList[0] -> sList[1]) +12byte 

printf("%d",sp->id);
printf("%d",sp->midterm);
printf("%d",sp->final);

sp++ // (sList[1] -> sList[2]) +12byte

printf("%d",sp->id);
printf("%d",sp->midterm);
printf("%d",sp->final);


구조체 변수를 선언하는 2가지 방법
(1)
정의
struct person {
    char name[10];
    int age;
};

선언
struct person p;

(2)
정의
typedef struct person{
    char name[10];
    int age;
} Person; //Person은 구조체 타입

선언
Person p;


관련 예시 1
typedef int element;
element(데이터 타입) num; (데이터 타입 int형을 element로 대신 쓰겠다)


구조체를 함수 매개변수로 전달

typedef struct {
    char name[10];
    int age;
} Person;

void printPerson1(Person a);
void printPerson2(&aPerson);

void printPeople(Person *p, int size);

int main(void)
{
    Person aPerson = {"Suehee", 30};
    Person people[3] = {{"에릭",38}, {"윤계상",37},{"서현진",32}}

printPerson1(aPerson);
printPerson2(&aPerson);

printPeople(people,3);


1. 구조체: 구조체를 전달(복사)
*근데 배열 이름으로 주는 건 주소값으로 준다는 거랑 마찬가지 아닌가?? 이건 배열 아닌가??
1.void printPerson1(Person a){
    printf("이름 %s 나이 %d\n",a.name, a.age);
}

여기서 나이 a.age=50으로 바꾸면 원본 안 바뀜

2.

for(i=0; i<3; i++)

    printfPerson1(people[i]);

 


2. 구조체 포인터: 구조체의 주소를 전달
1. void printPerson2(Person *p){
    printf("이름 %s 나이 %d\n",p->name, p->age);
}
여기서 나이 age=50으로 바꾸면 원본 바뀜.

2.

for(i=0; i<3; i++)

    printPerson2(&people[i]);

3. 배열

1.

void printPeople(Person *p, int size){

    int i;

    for(i=0; i<size; i++){

        printf("이름 %s 나이 %d\n",p->name,p->age)

        p++;

    }

}

2.

void printPeople(Person *p, int size){

    int i;

    for(i=0; i<size; i++)

        printf("이름 %s 나이 %d\n",p[i].name, p[i].age);

}

 

 

연습 #1 : aPerson의 age값이 40으로 바뀌도록.

void tenYearsAfter(Person *p){

    (*p).age += 10;

}

 

int main(void){

    Person aPerson = {"Suehee", 30);

    

    tenYearsAfter(&aPerson);

    printPerson1(aPerson);

}

 

구조체를 함수의 매개변수로 넘길 때 구조체 포인터로 사용하는 두 가지 이용

1. 복사하면 시간 더 걸리고 메모리 많이 차지함

2. 인수로 전달되면서 구조체 내용이 바뀌어야 할 때

 

연습 #2

typedef struct {

    int midterm;

    int final;

} Score;

 

void printScore(Score *p) {

    printf("중간고사 성적은 %d\n", p->midterm );

    printf("학기말고사 성적은 %d\n", p->final );

}

 

Score totalScore1(Score *p1, Score *p2){

    Score temp;

    temp.midterm = p1->midterm + p2->midterm;

    temp.final = p1->final + p2->final;

    return temp; //Score 타입으로 return 

}

 

void totalScore2(Score *p1, Score *p2, Score *total) {

    total->midterm = p1->midterm + p2->midterm;

    total->final = p1->final + p2->final;

}

 

int main(void) {

    Score s1, s2, tempScore;

 

    s1.midterm = 50; s1.final = 100;

    s2.midterm = 70; s2.final = 70;

 

// totalScore1과 totalScore2의 호출 및 함수 정의를 잘 살펴보라.

    tempScore = totalScore1(&s1, &s2); // 중간고사, 학기말고사를 각각 더해서 구조체 tempScore를 만든다   

    printScore(&tempScore);

 

    totalScore2(&s1, &s2, &tempScore);

    printScore (&tempScore);

}

'-' 카테고리의 다른 글

document 객체  (0) 2021.12.12
파일 입출력  (0) 2021.11.30
구조체  (0) 2021.11.16
자바스크립트 - 연산자, 조건문  (0) 2021.11.12
문자/문자열 처리함수  (0) 2021.11.09

댓글