본문 바로가기

C언어

컴프 12주차

<포인터 구조체>

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);
}

'C언어' 카테고리의 다른 글

13주차 컴프  (0) 2023.11.25
컴프 11주차  (0) 2023.11.10
컴프 9주차 요약  (0) 2023.11.04
컴프 10주차  (0) 2023.11.04
컴프 7주차  (0) 2023.10.14