Reivew:구조체 포인터

Icarus<Wing>·2022년 10월 8일
0

구조체 포인터

  • 구조체 포인터란? -> 구조체의 멤버변수에 간접참조하는 포인터이며,
    구조체는 아시다시피 복합데이터형이 모여있는 공간이기 때문에 구조체를 선언할 때마다 복사가 되어 메모리가 낭비되어서 포인터로 간접참조하는 것이 효율적이다.
#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;
};
//struct는 키워드고 Rectangle은 구조체 이름

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;로 구조체를 동적으로 할당할 수 있다.
profile
모든 코드에는 이유가 있기에 원인을 파악할 때까지 집요하게 탐구하는 것을 좋아합니다.

0개의 댓글