<포인터 구조체>
struct student { // student는 구조체명, 태그, 메모리가 잡히지 않음
int id;
int midterm;
int final;
};
배열과다르게 형태가 다른 데이터도 하나로 묶을 수 있음.
struct student aStudent; //일반 변수
struct student *sp = &aStudent; //포인터의 주소값을 가리킴.
aStudent.id //일반 구조체가 접근할 때
*sp.id //포인터변수가 가리키는 값을 접근할 때
sp->id //위의 코드와 같음. 구조체 변수에 접근할 때
=> 우선순위 : (*sp).id => sp자리로 가서 id
//포인터 sp를 사용하여 구조체 멤버 각각에 값 설정
sp->id = 19950001 //(*sp).id = 19950001; 로 써도 됨.
sp->midterm = 100; //(*sp).midterm = 100; 로 써도 됨.
sp->final = 50; //(*sp).final = 50; 로 써도 됨.
//포인터 sp를 사용하여 구조체 멤버의 값을 입력
printf("학번 입력:");
scanf("%d", &sp->id );
printf("중간고사 입력:");
scanf("%d", &sp->midterm );
printf("학기말고사 성적 입력:");
scanf("%d", &sp->final );
//포인터 sp를 사용하여 구조체 멤버의 값을 출력한다.
printf("학번: %d 중간: %d 학기말: %d\n", sp->id, sp->midterm, sp->final );
//포인터 sp를 사용하여 구조체 멤버의 값을 출력한다.
printf("학번: %d 중간: %d 학기말: %d\n", sp->id, sp->midterm + sp->final );
< 연산자 -> >
-> 대신 *와 .(dot)를 사용할 수있다.
sp->id은 (*sp).id와 같다.
여기서 괄호를 사용하는 이유는? 답: 우선순위 때문
struct student sList[3]; // sList[0], sList[1], sList[2]는 각각 구조체 변수
// sp가 sList 배열의 처음(sList[0])을 가르치게 하려면
struct student *sp = sList; // == struct student *sp = &sList[0];
// sp를 사용하여 첫번째 배열 원소(sList[0])의 멤버들을 출력
printf("%d ", sp->id );
printf("%d ", sp->name );
printf("%d ", sp->midterm );
// sp가 다음 원소(즉, sList[1])를 가르키게한다.
sp++;
// sp를 사용하여 배열 원소(sList[1])의 멤버들을 출력
printf("%d ", sp->id )
printf("%d ", sp->name )
printf("%d ", sp->midterm );
// sp가 다음 원소(즉, sList[2])를 가르키게한다.
sp++;
// sp를 사용하여 배열 원소(sList[2])의 멤버들을 출력
printf("%d ", sp->id )
printf("%d ", sp->name )
printf("%d ", sp->midterm );
*다시 sp를 앞으로 보내고 싶으면 *sp = sList;를 작성하면 됨.
<typedef 로 구조체 타입 선언>
일반
//구조체명 선언(정의)
struct person {
char name[10];
int age;
};
struct person p; // 구조체 변수 p 선언
typedef
//구조체타입 선언(정의)
typedef struct person { //person은 구조체명(생략가능)
char name[10];
int age;
} Person; // Person은 구조체타입.
Person p; // 구조체 변수 p 선언
+) typedef는 아무 때나 다 사용할 수 잇음.
int element = 100; 이라고 할 때
typrdef int num; //int 대신 element으로 바꿔씀. 즉, 자료형의 이름을 마음대로 사용할 때.
element score = 100;
--------------------------------------------------------
struct person { //person은 구조체명(생략가능)
char name[10];
int age;
} 가 int라고 생각하면 되고, person이 num이라고 생각하면 됨.
---------------------------------------------------------
struct person { //person은 구조체명(생략가능)
char name[10];
int age;
}
typedef struct person s; //struct person 대신 s를 사용할 수 잇음. 길기 때문에 축약하고 싶어서 사용함.
주로 태그 이름을 대문자로 쓰는 경우가 많이 있음.
그래서 student가 자료형이라고 생각하면 됨.
#include <stdio.h>
typedef struct {
char name[10];
int age;
} Person; // Person은 구조체타입.
void printPerson1(Person a ) // call by value
{
printf("이름 %s 나이 %d\n", a.name, a.age );
}
void printPerson2(Person *p) // call by reference : p는 포인터
{
printf("이름 %s 나이 %d\n", p->name, p->age );
}
void printPeople(Person *p, int size) // call by reference: p는 포인터 : Person p[]라고 써도 됨
{
int i;
for (i = 0; i < size; i++)
printf("이름 %s 나이 %d\n", p[i].name, p[i].age);
}
void printPeople(Person *p, int size) // call by reference: p는 포인터 : Person p[]라고 써도 됨
{
int i;
for (i = 0; i < size; i++)
printf("이름 %s 나이 %d\n", p -> name, p -> age);
p++; //위처럼 써도 되는데 이렇게 p를 증가시켜줘야 함.
}
int main(void)
{
Person aPerson = {"Suehee", 30};
Person people[3] = {{"에릭", 38}, {"윤계상", 37}, {"서현진", 32}};
//아래의 호출에서 인수들을 잘 살펴보자.
printPerson1(aPerson); //데이터 타입이 Person임.
printPerson2(&aPerson);
printPeople(people, 3);
}