struct

박진은·2022년 5월 18일
0

C

목록 보기
8/9

struct

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, &center};
    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

출력결과 동일한것을 알 수 있다.

profile
코딩

0개의 댓글