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