c언어에서 구조체는 객체지향 언어랑 가장 유사한 형태를 보여주는 것이다.
#include <stdio.h>
#include<string.h>
#include<math.h>
#define _CRT_SECURE_NO_WARNINGS_
struct point {
int xpos;
int ypos;
};
int main(int argc, const char * argv[]) {
struct point pos1, pos2;
double distance;
fputs("point1:",stdout);
scanf("%d %d",&pos1.xpos, &pos1.ypos);
fputs("input point2",stdout);
scanf("%d %d",&pos2.xpos,&pos2.ypos);
distance = sqrt(((double)(pos1.xpos - pos2.xpos)*(pos1.xpos - pos2.xpos)) + ((double)(pos1.ypos-pos2.ypos)*(pos1.ypos-pos2.ypos)));
printf("두 점사이의 거리는 %lf",distance);
}
구조체 선언할 때 반드시 뒤에 세미콜론 붙여주세용. 안붙이면 오류가 발생합니다
구조체를 선언해서 사용할 때는 반드시 사용해야하는 키워드가 있는데 그게 바로 struct 키워드이다
선언시에 사용할 때의 문법은
struct 구조체이름 {
바디 작성
};
그리고 사용할때 사용하는 문법은 다음과 같다.
일단 메인함수에서 사용하려면 구조체 변수를 선언해야한다
int main(void){
struct 정의했던변수이름 자바로따지면레퍼런스객체이름;
{
위에서 사용하는 문법을 준수하지 않으면 문법적으로 오루가 발생해서 컴파일이 안된다.
struct point {
int xpos;
int ypos;
};
//
// main.c
// 20220517
//
// Created by 박진은 on 2022/05/17.
//
#include <stdio.h>
#include<string.h>
#include<math.h>
#define _CRT_SECURE_NO_WARNINGS_
struct person{
int age;
char phonenumber[20];
char name[20];
};
int main(void){
struct person p1, p2;
fputs("이름을 입려가세요:",stdout);
scanf("%s",p1.name);
fputs("전화번호를 입력하세요:",stdout);
scanf("%s",p1.phonenumber);//무낮열이기 때문에 주소값을 반환하는 연산자를 사용하지 않음;
fputs("나이를 입력하세요",stdout);
scanf("%d",&p1.age);//구조체 변수도 일반 변수와 동일하게 사용한다.
fputs("이름을 입력하세요",stdout);//puts와는 다르개 출력하는 버퍼를 설정할 수 있는 함수이고 일어들일기 가능
scanf("%s",p2.name);
strcpy(p2.phonenumber,"01024213046");//문자열을 복사하는 함수 사용해서 한번에 입력;
fputs("나이를 입력하세요 해놓고 직접적으로 입력해버리기",stdout);
p2.age = 23;
printf("p1의 정보를 출력합니다\n");
printf("나이: %d\n",p1.age);
printf("전화번호: %s\n",p1.phonenumber);
printf("이름: %s\n",p1.name);
printf("p2의 정보를 출력합니다\n");
printf("p2 나이: %d\n",p2.age);
printf("p2 이름: %s\n",p2.name);
printf("p2 전화번호 %s\n",p2.phonenumber);
}
괜히 너무 적은거 같아서 쓴거임 의미 없습니다.
struct person{
int age;
char phonenumber[20];
char name[20];
};
struct point{
int posx;
int posy;
};
int main(void){
struct person p1 = {24,"010202304234","박진은"};
struct point point = {123,1234};
printf("%d %s %s\n",p1.age, p1.name, p1.phonenumber);
printf("loaction : %d %d",point.posx, point.posy);
}
구조체를 선언한고 한번에 초기하는 방법
한번에 초기화하기 위해서는 변수가 선언된 순서대로 중괄호안에 자료형에 맞춰서 쑤셔넣으면 존나 가능하다.
struct person{
int age;
char phonenumber[20];
char name[20];
}p1, p2, p3;
struct point{
int posx;
int posy;
}pos1, pos2;
구조체 선언과 동시에 변수 선언해서 사용하는 방법
#include <stdio.h>
#include<string.h>
#include<math.h>
#define _CRT_SECURE_NO_WARNINGS_
struct employee{
char name[20];
char address[100];
char phonenumber[30];
char Id[20];
};
struct point{
int posx;
int posy;
};
int main(void){
struct point list[4];
struct employee em[5]={
{"회장박진은","경기도 성남시 분당구 판교역로 235 에이치스퀘어 N동 7층 (우)13494","01024213046","990310"},
{"대리최규현","경기도 성남시 분당구 판교역로 235 에이치스퀘어 N동 7층 (우)13494","01012341234","9901234"},
{"운전기사 김학래", "경기도 성남시 분당구 판교역로 235 에이치스퀘어 N동 7층 (우)13494","0101231234","991234"},
{"문지기 김민서","경기도 성남시 분당구 판교역로 235 에이치스퀘어 N동 7층 (우)13494","01012341234","991234"}
};
for(int i = 0; i< 5; i++){
printf("%s %s %s %s\n",em[i].name, em[i].address, em[i].phonenumber, em[i].Id);
}
for(int i = 0; i<4; i++){
printf("%d. 점을 입력하세요:",i);
scanf("%d %d",&list[i].posx, &list[i].posy);
}
for(int i = 0; i< 4; i++){
printf("%d 번째 점의 위치는 (%d, %d)\n",i+1,list[i].posx,list[i].posy);
}
}
구조체를 배열을 만들고 초기화하는 방법
중괄호를 사용해서 객체를 구분하여 작성한다.
struct employee em[5]={
{"회장박진은","경기도 성남시 분당구 판교역로 235 에이치스퀘어 N동 7층 (우)13494","01024213046","990310"},
{"대리최규현","경기도 성남시 분당구 판교역로 235 에이치스퀘어 N동 7층 (우)13494","01012341234","9901234"},
{"운전기사 김학래", "경기도 성남시 분당구 판교역로 235 에이치스퀘어 N동 7층 (우)13494","0101231234","991234"},
{"문지기 김민서","경기도 성남시 분당구 판교역로 235 에이치스퀘어 N동 7층 (우)13494","01012341234","991234"}
}; 마직막에 세미콜론을 갈겨야 완료된다.
→연산자는 struct pointer에서
#include <stdio.h>
struct point {
int posx;
int posy;
};
struct circle{
double radius;
struct point *center;//원의 중심 나타내기 위해서 sturct point를 사용함.
};
int main(int argc, const char * argv[]) {
struct point p1, *sptr;
p1.posx = 100;
p1.posy = 200;
printf("present location: %d %d\n",p1.posx, p1.posy);
sptr = &p1;
sptr->posx = 500;
(*sptr).posy = 1000;
printf("variation of struct pointer: %d %d ",(*sptr).posx, (*sptr).posy);
double radius = 20.12;
struct point center={100, 200};
struct circle cir = {radius, ¢er};
printf("\n infomation of circle: radius: %lf posx:%d posy:%d \n",cir.radius, cir.center->posx, (*cir.center).posx);
}
struct point p1, *sptr;
구조체 포인터 선언 구조체 객체하나랑 stpt라는 pointer객체의 주소를 저장하는 포인터를 선언함.sptr->posx = 500; (*sptr).posy = 1000;
구조체 포인터를 이용해서 구조체에 접근하는 두가지 방법. 원래 포인터 연산자를 사용해서 접급하려면 소괄호와 점연산이 필요하다 하지만 →연산자 이용하면 세가지 연산자를 사용하지 않고 한번에 접근이 가능하다.#include <stdio.h>
struct point{
int posx;
int posy;
struct point *link;//구조체 내부에 자체 구조체 포인터 선언
};
int main(int argc, const char * argv[]) {
struct point p1 = {1,2};
struct point p2 = {3,4};
struct point p3 = {5,6};
p1.link = &p2;
p2.link = &p3;
p3.link = &p1;
printf("point1 : %d %d link to point2: %d %d\n",p1.posx, p1.posy, p1.link->posx, p1.link->posy);
printf("point2 : %d %d link to point3: %d %d\n",p2.posx, p2.posy, p2.link->posx,p2.link->posy);
printf("point3 : %d %d link to point1: %d %d\n",p3.posx,p3.posy,p3.link->posx,p3.link->posy );
}
구조체 내부에 구조체 자체의 포인터 변수를 선언해서 각각의 객체를 연결함.
"구조체 변수의 주소값은 구조체의 첫번째 변수의 주소값과 동일하다."
#include <stdio.h>
struct point{
int posx;
int posy;
struct point *link;//구조체 내부에 자체 구조체 포인터 선언
};
struct person{
char name[30];
int age[10];
};
int main(int argc, const char * argv[]) {
struct point p1 = {1,2};
struct person man ={"park jin eun", 24};
printf("point 객체인 p1의 주소값 %p, point 객체의 첫번째 변수인 p1의 posx의 주소값: %p\n",&p1,&p1.posx);
printf("person 객체인 man의 주소값 %p, person 객체인 man 의 첫번째 변수인 name의 주소값 %p\n",&man,&man.name);
}
point 객체인 p1의 주소값 0x16fdff240, point 객체의 첫번째 변수인 p1의 posx의 주소값: 0x16fdff240
person 객체인 man의 주소값 0x16fdff260, person 객체인 man 의 첫번째 변수인 name의 주소값 0x16fdff260
출력결과 동일한것을 알 수 있다.