profile image

L o a d i n g . . .

Published 2021. 9. 20. 21:38

구조체(Struct)

 

같은 타입의 데이터들을 묶는 배열과 달리 구조체는 타입이 다른 데이터를 하나로 묶을 때 사용한다.

 

구조체 안의 각각의 데이터는 필드 혹은 멤버라고 칭한다 (C언어에서는 필드)

 

구조체를 정의 할 때에는 struct 라는 키워드를 사용한다.

struct example {
	char cfiled;
    int ifield;
};

정의 만으로는 주소가 할당되지 않고

변수로 선언했을 때 주소가 할당된다.

struct example s1; //cfield와 ifield를 가진 s1 구조체 선언

 

 

typedef

C언어에는 프로그래머가 자기 자신이 이해하기 쉽게 할 수 있는 타입명을 만들수 있게 하는 typedef가 있다.

이를 통해서 생성된 구조체의 의미를 쉽게 파악할 수 있게 할 수 있다.

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

Person person1; // 구조체 변수 선언

 

멤버 연산자(Member Operator)

구조체안의 각각의 필드에 접근하기 위해서는 멤버 연산자( . )를 이용해야한다.

.필드이름 으로 해당 필드에 접근할 수 있다.

person1.age = 10; //age 필드에 10 저장
person1.salary = 10000;
strcpy(person1.name, "james"); //person1.name은 문자형 배열이기 때문에 strcpy()함수 사용

 

대입(Assignment)

Person person1, person2; //구조체 person1, person2 선언

person1 = person2;

초기 C언어 버전에서는 구조체 대입이 허용이 안되었고 필드 각각을 대입해 줬어야 했지만

현재는 가능하다.

 

비교 연산( ==, !=, <, >, <=, >= )

if (person1 == person2)

불가능하다

 

구조체 안에 구조체

typedef struct {
	int month;
    int day;
    int year;
} date;

typedef struct person {
	char name[10];
    int age;
    float salary;
    date dob; //위에서 선언된 date구조체
} Person;

Person person1;

 

구조체 안의 구조체에 접근할때는?

person1.dob.month = 3;
person1.dob.day = 13;
person1.dob.year = 1997;

 

공용체(Unions)

구조체와 유사하지만 union의 필드들은 메모리를 공유한다. 즉 한 순간에 하나의 필드로서만 사용된다.

 

포인터(Pointers)

다른 변수의 주소를 가지고 있는 변수

char a = 'A'; // A의 문자가 초기화되어 있는 a변수
char *p; // char형 포인터변수 p 선언
p = &a; // a의 주소를 포인터변수 p에 초기화

포인터가 가리키는 내용의 변경: * 연산자 사용

*p = 'B'; //포인터 변수가 가르키고 있던 변수 a에 'B' 대입

& 연산자 : 변수의 주소를 추출

* 연산자 : 포인터가 가리키는 대상을 의미

 

p //포인터
*p // 포인터가 가리키는 대상
*p++ // 포인터가 가리키는 대상의 값을 가져온 다음, 포인터를 한칸 증가한다.
*p-- // 포인터가 가리키는 대상의 값을 가져온 다음, 포인터를 한칸 감소한다.
(*p)++ // 포인터가 가리키는 대상의 값을 증가시킨다.

int a; // 정수 변수 선언
int *p // 정수 포인터 선언
int **pp // 정수 포인터의 포인터 선언
p = &a; // 변수 a와 포인터 p를 연결
pp = &p; // 포인터 p와 포인터의 포인터 pp를 연결

 

포인터의 적용

void *p // p는 아무것도 가리키지 않는 포인터
int *pi; //pi는 정수 변수를 가리키는 포인터
float *pf; //pf는 실수 변수를 가리키는 포인터
char *pc; //pc는 문자 변수를 가리키는 포인터
int **pp; //pp는 정수 포인터를 가리키는 포인터
struct person *ps //ps는 person타입의 구조체를 가리키는 포인터
void (*f)(int ); //f는 int를 인자로 받고 리턴값이 void인 함수를 가리키는 포인터
char *argv[]; //문자 변수를 가르키는 포인터들의 배열

포인터는 필요할때마다 형변환이 가능하다

void *p;
pi=(int *)p;

 

 

'Language > C' 카테고리의 다른 글

[C/C++] 이중 LinkedList 구현 예제  (0) 2021.10.14
[C / C++] 단일 Linked List 예제 1  (0) 2021.10.07
[C] Linked List - 삽입, 삭제, 순회  (0) 2021.10.04
복사했습니다!