구조체 (struct)
: 서로 다른 종류의 변수들을 하나로 묶어서 새로운 자료형을 정의 하는 것
구조체 정의 ∙ 선언
- 구조체 정의
// struct 구조체이름
struct phone{
// 자료형 변수명;
char name[10];
int number;
double sound;
}; // 꼭 세미콜론(;) 붙이기
- 구조체 선언
int main(void){
// struct 구조체이름 변수명;
struct phone p;
return 0;
}
typedef 키워드
: 이미 존재하는 타입에 새로운 이름을 붙일 때 사용
- typedef 사용한 구조체 정의
// typedef struct (구조체이름)
typedef struct phone{
// 자료형 변수명;
char name[10];
int number;
double sound;
}PHONE;
// 구조체의 새로운 이름;
// 꼭 세미콜론(;) 붙이기
구조체의 정의와 typedef 선언을 동시에 할 경우 구조체의 이름 생략 가능
- typedef 사용한 구조체 선언
int main(void){
// 구조체의새로운이름 변수명;
PHONE p;
return 0;
}
구조체 변수 초기화 ⋅ 멤버 접근
int main(void){
struct phone p = {"jaksim", 3, 1.4};
struct phone ph = {.name = "miskaj", .number = 0};
printf("name : %s | num : %d | sound : %lf \n", p.name, p.number, p.sound);
printf("name : %s | num : %d | sound : %lf \n", ph.name, ph.number, ph.sound);
return 0;
}
| name : jaksim | num : 3 | sound : 1.400000 name : miskaj | num : 0 | sound : 0.000000 |
변수 초기화
- struct phone p = {"jaksim", 3, 1.4};
- struct 구조체이름 변수명 = {멤버변수1의 초깃값, 멤버변수2의 초깃값, ...}
- 멤버 변수가 정의된 순서에 따라 차례대로 초깃값 설정
- 초깃값 설정이 되지 않은 멤버 변수는 0으로 초기화
- struct phone ph = {.name = "miskaj", .number = 0};
- struct 구조체이름 변수명 = {.멤버변수1이름 = 초깃값, .멤버변수2이름 = 초깃값 , ...}
- 원하는 멤버 변수만 초깃값 설정
- 멤버 변수가 정의된 순서와 초기화 순서는 아무런 상관 없음
- 초깃값 설정이 되지 않은 멤버 변수는 0으로 초기화
멤버 변수 접근
- p.name
- 구조체변수이름.멤버변수이름
구조체 배열 선언
int main(void){
struct phone pArr[3] = {
{"jaksim", 3, 1.4},
{"three", 2, 2.4},
{"day", 1, 3.4},
};
printf("name : %s | num : %d | sound : %lf \n", pArr[0].name, pArr[1].number, pArr[2].sound);
return 0;
}
| name : jaksim | num : 2 | sound : 3.400000 |
: 구조체 배열에서 각 배열 요소로 접근하는 방법과 일반 배열의 접근 방법은 동일
구조체를 가리키는 포인터
int main(void){
struct phone p = {"jaksim", 3, 1.4};
struct phone* ptr_p;
ptr_p = &p;
printf("name : %s | num : %d | sound : %lf \n", (*ptr_p).name, (*ptr_p).number, (*ptr_p).sound);
printf("name : %s | num : %d | sound : %lf \n", ptr_p->name, ptr_p->number, ptr_p->sound);
return 0;
}
| name : jaksim | num : 3 | sound : 1.400000 name : jaksim | num : 3 | sound : 1.400000 |
구조체 포인터 선언
- struct phone* ptr_p;
- struct 구조체이름* 구조체포인터이름
포인터에 할당
- ptr_p = &p;
- 배열과는 달리 구조체 이름은 주소가 아님
=> 반드시 주소연산자(&)를 사용하여 포인터에 할당.
- 배열과는 달리 구조체 이름은 주소가 아님
멤버 변수 접근
- 참조 연산자(*) 이용하는 방법 : (*ptr_p).name
- (*구조체포인터).멤버변수이름
- 참조 연산자(*) 사용시 멤버 연산자(.)보다 우선순위가 낮아 반드시 괄호()를 사용해야함
- 화살표 연산자(->)를 이용하는 방법 : ptr_p -> name
- 구조체포인터 -> 멤버변수이름
- 일반적으로 포인터 사용 시 화살표 연산자가 많이 사용됨.
출처:
https://tcpschool.com/c/c_struct_pointer (강추) <<
https://studyc.tistory.com/23
https://dream-and-develop.tistory.com/10
https://dev-hyonie.tistory.com/49#dt01
https://dev-hyonie.tistory.com/47
오늘 백준 풀다가 이건 정리하고 싶어서 새벽에 급발진으로 자료 정리해서 작성해봄
포인터 정리 찐으로 할거임 ㄱㄷ..ㅎ
파이썬에 디렉터리랑 자바의 클래스참조(?) 요런 느낌이랑 비슷한 같다고 안함 느낌을 받음.
아마 C언어도 클래스 참조가 있지 않나
공부할거 드릅게 많음 ;; ㅋ
ㅂㅇ
'언어 > C언어' 카테고리의 다른 글
| C언어의 문자열 입력 함수 scanf(), gets() (1) | 2025.07.30 |
|---|---|
| C언어의 세그멘테이션 오류 (Segmentation Fault) (0) | 2025.07.03 |
| C언어의 자료형 (Data Type) (1) | 2025.07.02 |
| C언어의 기본 (1) | 2025.07.01 |






