구조체(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 |