구조체 포인터
- 구조체 포인터란? -> 구조체의 멤버변수에 간접참조하는 포인터이며,
구조체는 아시다시피 복합데이터형이 모여있는 공간이기 때문에 구조체를 선언할 때마다 복사가 되어 메모리가 낭비되어서 포인터로 간접참조하는 것이 효율적이다.
#include <iostream>
using namespace std;
struct Rectangle
{
int length;
int breath;
};
int main()
{
struct Rectangle r = { 10,5 };
r.length = 15;
cout << r.length << endl;
struct Rectangle* p = &r;
(*p).breath = 20;
cout << (* p).breath << endl;
p->breath = 35;
cout << p->breath << endl;
return 0;
}
- 제시된 코드의 메모리를 그림으로 그려보면 다음과 같다.

- 포인터 변수는 참조하는 데이터형에 상관없이 항상 4byte다(단, 64비트에서는 8byte)
- 구조체 포인터 변수는 r의 주소를 저장한다
- 구조체 포인터로 멤버변수에 엑세스할 때는
(*p).length 또는 p->length로 간접참조한다.
💡구조체 또는 구조체 변수 자체를 출력하려고 하면, class타입이라고 에러가 난다. 즉, 구조체의 멤버변수를 통해서만 출력이 된다.
구조체 포인터 동적 할당
#include <iostream>
#include <stdlib.h>
using namespace std;
struct Rectangle {
int length;
int breath;
};
int main()
{
struct Rectangle* p;
p = (struct Rectangle*)malloc(sizeof(struct Rectangle));
p->length = 10;
p->breath = 15;
cout << p->length << endl;
cout << p->breath << endl;
return 0;
}
- struct는 키워드고 Rectangle는 구조체 이름이다. 즉, int와 같이 struct Rectangle 전체가 구조체 변수이므로 앞에
(struct Rectangle*)를 반환하고, sizeof(struct Rectangle)의 메모리를 할당해준다.
💡따라서 착각해서 앞에 (struct*)를 쓴다거나 sizeof(struct)를 쓰면 에러가 난다.
- c++에서는 메인에서 선언할 때 struct 키워드를 안붙여도 된다.
- c++에서는
p = new Rectangle;로 구조체를 동적으로 할당할 수 있다.