-
[C/C++] 구조체기초/C,C++ 2017. 3. 6. 10:56
구조체
struct
구조체는 "변수의 묶음"이라고 생각하시면 됩니다.
예를들어 "학생"에대한 국어,영어,수학점수와 그의 대한 총점 평균에 대해서 정의한다고 가정했을 때
void main(){
char* name;
int kor;
int eng;
int math;
int sum;
double avg;}
이렇게 정의하신 후 여러개를 정의한다고 했을때 각각의 변수마다 배열로 정의해 주셔야 합니다.
char* name[];
int kor[];
int eng[];.......
이러면 너무 귀찮지 않나요?
이렇게 특정한 대상에 대한 변수들을 한번에 묶어서 사용할 수 있습니다.
[선언]
struct 구조체이름{
선언될 변수들..
...
...
};
//세미콜론을 붙여준다
메인 함수에서
struct 구조체이름 구조체변수이름;
구조체변수이름.선언된변수 ← 접근;
[사용법]
구조체는 함수들 위에 정의해주시면 됩니다.
키워드 struct
위에 코드를 구조체로 바꿔준다면
struct student{
char* name;
int kor;
int eng;
int math;
int sum;
double avg;
};void main(){
struct student st;
st.name = "";
st.kor = 100;
st.eng = 50;
}
선언을 해주신다음 .으로 접근하시면 됩니다.
구조체 변수라는 말에 느낌이 오시나요?
#1.변수는 배열로 만들수 있다.
#2.변수앞에는 자료형이 온다.
▼
#1.구조체 배열로 만들수 있다.
#2.구조체앞에는 자료형이 온다.
내가 선언한 구조체는 메인에서 만들 구조체의 자료형이다.
[#1]
그럼 구조체를 변수로 만들어 주시면 됩니다.
struct student st[10];
st[0].name = "빨간궁뎅이";
st[1].name = "파란궁뎅이";
st[2].name = "탱탱한궁뎅이";접근도 배열처럼 해주시면 되구요.
변수면 파라매터로도 넘길 수 있겠네요?
너무 ....꼬아 놨네요 ....
먼저 메인함수에서 구조체에 대한 포인터변수 sPtr를 선언했습니다.
struct student * 형식의 리턴값을 가지는 함수를 만들었습니다.
(구조체 주소값을 리턴시켜주기위해)
그다음에 파라매터는 당연히 구조체 주소값을 받았구요.
그다음에 만들어놓은 함수에서 배열 3번째의 name값을 변경한뒤 주소값을 리턴시켜줬는데요.
리턴값을 받은 메인함수에서는 역시 잘 출력되는것을 볼 수 있었네요.
[#2]
구조체 선언과 동시에 이름을 부여할 수도 있습니다.
키워드 : typedef
typeder old_type new_type
old_type : int,float ... 기존에 정의된 자료형
new_type : 자료형에 붙일 이름?
따라서 struct student은 자료형이기때문에
typedef키워드를 붙여서 STUDENT로 바꿔줍니다.
그럼 모든 소스코드에 STUDENT 자료형을 사용하면 struct student를 사용하실 필요가 없습니다.
똑같은 결과이지만 더 깔끔해졌네요!!
(너무... 억지로 만든 함수같네요;;)
[구조체 포인터]
쉽게 설명하기 위해서 그냥 변수와 포인터를 선언했습니다
int type num을 선언해서
포인터 pnum의 주소값을 num으로 넣어놨습니다.
똑같이
앞에서 정의한 STUDENT타입의 st를 선언해서
포인터 pst에 st를 넣었습니다.
변수처럼 (*)를 사용해서 접근합니다.
또한 구조체안의 변수에 접근을 할때 .을 사용했지만
*기호와 .을 생략하고
(->)를 사용해서 접근할 수 도있습니다.
더 편리하니 포인터를 사용할 때는 -> 사용하는거 기억해두세요.
[소스]
#include <stdio.h>
#include <string.h>typedef struct student{
char *name;
int age;
char *area;
}STUDENT;void main(){
int num;
int * pnum = #
STUDENT st;
STUDENT * pst = &st;strcpy((*pst).name,"서울우유");
(*pst).age = 30;printf("%s %d\n", (*pst).name,(*pst).age);
printf("%s %d\n", pst->name,pst->age);
return 0;
}'기초 > C,C++' 카테고리의 다른 글
[C/C++] #define, 전처리기, (0) 2017.03.08 [C/C++] 메모리영역 (0) 2017.03.07 [C/C++] 클래스, 구조체, 함수의 차이점 (0) 2017.03.03 [C/C++] 반환 형식 ,Call by ~ (0) 2017.03.02 [C,C++] 포인터와 배열 (0) 2017.03.02