[C++] 구조체 포인터

꿈별·2023년 5월 8일
0

C++

목록 보기
14/27

✔구조체 포인터

  • 구조체를 함수의 인수로 사용할 경우의 문제점
    : 구조체의 각 멤버 값이 복사되어 함수로 전달된다. 이 때 구조체의 멤버가 많다면 함수를 호출할 때마다 많은 멤버들을 복사하게 되어 호출이 지연되고 성능 저하가 발생할 수 있다.

    • 💡 구조체 포인터를 인수로 사용하기
      -> 함수 호출 시 구조체 변수의 주소만 함수로 넘기기 때문에 속도가 빠르고, 함수 내에서 구조체 변수의 멤버 값을 변경시킬 수 있다.


  • 예시

    • a, b는 변수가 아니고 자료형 MYST의 파트를 지칭하는 이름, 멤버이다.
typedef struct _tagMyST
{
	//멤버 a, b
	int a;
    float b;
}MYST;

MYST s = {}; //구조체 변수 s 초기화
MYST* pST = &s; //포인터 pST가 s의 주소로 접근
pST + 1; //시작 주소에서 8byte씩 증가

  • ❗주의
    • 포인터는 가리키는 곳의 실제 타입을 고려하지 않는다.
      따라서 아래와 같은 경우, f가 실제로 float이 아닌 char 타입이라고 하더라도. 그냥 3.14f를 대입하게 된다.
      -> 검증 과정이 없다.
    • 포인터 타입과 실제 타입을 동일하게 작성하면 문제 없음
(*pST).a = 100;
(*pST).f = 3.14f;

  • 구조체 포인터를 이용해 구조체 멤버로 접근하는 방법
  1. 참조 연산자(*) 사용
[문법]
(*구조체포인터).멤버변수이름

ex)
(*pST).a
  1. 화살표 연산자(->) 사용
    역참조한 뒤, 파트 지칭하는 것을 한 번에 표현함
[문법]
구조체포인터->멤버변수이름

ex)
pST->a

//두 방법은 똑같이 동작한다.

(*pST).a = 100;
(*pST).f = 3.14f;

pST->a = 100;
pST->f = 3.14f;

(*pST).a 처럼 표현할 때. 참조 연산자(*)는 멤버 연산자(.)보다 연산자 우선순위가 낮으므로 반드시 괄호(())를 사용해서 역참조를 가장 먼저 해줘야 한다.


[참고]
https://youtu.be/LOR7FNFUS9E
https://nybot-house.tistory.com/21
http://www.tcpschool.com/c/c_struct_pointer

0개의 댓글