기본 문법
#include <iostream>
struct S_DATA
{
int nData;
float fData;
};
int main()
{
S_DATA sData{};
sData.nData = 100;
sData.fData = 50.5f;
printf("%d\n", nData);
printf("%f\n", fData);
}
구조체는 변수들을 그룹짓는 것이다.
sData.nData = 100;
sData.fData = 50.5f;
이렇게 직접 접근해서 값을 바꾸기 때문에, 구조체는 변수가 public 으로 선언된다.
구조체 메모리 사이즈 계산하기
가장 큰 자료형을 기준으로 메모리 공간을 잡는다.
int 4바이트, char 1바이트기 때문에 int를 기준으로 메모리를 잡는다.
struct S_TEST
{
int n1;
char c1;
char c2;
int n2;
};
4바이트 확보
-> 4바이트 모두 n1이 사용
4바이트 확보
-> 1바이트 c1이 사용
-> 1바이트 c2이 사용
-> 2바이트 padding (2바이트로는 int를 못 담으니까)
4바이트 확보
-> 4바이트 모두 n2가 사용
구조체 S_TEST의 크기는 12바이트이다.
Q. 공부하면서 갑자기 궁금했던 질문
구조체 안에 구조체가 있다고 해서 메모리 기준을 구조체의 크기로 잡지는 않는다.
그 안의 기본 자료형 중에서 가장 큰 것을 기준으로 삼는다.
int 배열이 있어도 기본 자료형인 int 를 기준으로 계산한다.
네트워크 프로그래밍 할 때는 프로젝트 설정에서 메모리 기준을 1바이트로 고정해서 사용한다고 한다.
빨라야하니까.
함수 인자에 구조체
이렇게 복사로 넘기면 안 되고,
#include <iostream>
struct S_DATA
{
int nData;
float fData;
};
void printData(S_DATA sData);
int main()
{
S_DATA sData{};
sData.nData = 100;
sData.fData = 50.5f;
printData(sData);
}
void printData(S_DATA sData) // 복사 전달 하지마.
{
printf("%d, %f\n", sData.nData, sData.fData);
}
포인터로 넘겨야 한다. 이유는 구조체 사이즈 때문이다. 너무 커서...
#include <iostream>
struct S_DATA
{
int nData;
float fData;
};
void printData(const S_DATA *pData);
int main()
{
S_DATA sData{};
sData.nData = 100;
sData.fData = 50.5f;
printData(&sData);
}
void printData(const S_DATA * pData) // 포인터 전달로 하자.
{
printf("%d, %f\n", pData->nData, pData->fData);
}
구조체 포인터는 화살표 오퍼레이터를 사용할 수 있다.
void printData(const S_DATA * pData) // 포인터 전달로 하자.
{
printf("%d, %f\n", pData->nData, pData->fData);
printf("%d, %f\n", (*pData).nData, (*pData).fData);
}
화살표 오퍼레이터는 참조와 . 을 생략한다.
다중 포인터를 사용하게 될 경우에 유용하게 사용된다.
'기타 > C++' 카테고리의 다른 글
[C++] 클래스 기본 문법 / 클래스와 구조체의 차이 (0) | 2020.06.06 |
---|---|
[C++] 네임스페이스 (0) | 2020.06.06 |
[C++] 함수와 배열 쓸 때 참고하기 (0) | 2020.06.06 |
[C++] 함수 쓸 때 참고하기 (0) | 2020.06.06 |
[C++] 포인터 쓸 때 참고하기 (0) | 2020.05.20 |