[C++] 18. 구조체변수의 포인터 vs 정수형변수의 포인터

2022. 5. 31. 18:55코딩 1막 <C++개념편>

728x90

구조체를 이전에 배웠다. 

구조체는 직접 만들어서 쓰는 데이터 타입이라고 한다.

마치 도장을 찍는 것처럼

구조체와 배열을 써서 실습을 해봤다

문제는 지금부터다

'함수라는 기능을 써서 배열의 반복문을 좀 더 효율적으로 써볼 수 있지 않을까'라는 접근으로 함수를 호출해보기로 한다

그리고 구조체 포인터변수와 정수형변수의 포인터변수를 비교해볼것이다.

 

1. <구조체 Student의 포인터변수 >

#include <iostream>
#include <string>

using namespace std;

// 함수의 기능을 써서 구조체를 만들고 싶다

struct Student
{
	string name;
	int age;
	int id;
};

void PrintInfo(Student target)
{
	cout << "이름 : " << target.name << endl;
	cout << "나이 : " << target.age << endl;
	cout << "학번 : " << target.id << endl;
}

void SetInfo(Student* target, string newName, int newAge, int newId)
{
	// 구조체 포인터변수의 주소에서 멤버를 참조할때는 . 이 아닌 -> 로 접근한다
	target->name = newName;		
	target->age = newAge;
	target->id = newId;
}

void main()
{
	int num;

	Student studentA = { "학생A", 40, 1 };

	PrintInfo(studentA);
	// SetInfo(studentA, "학생A-2", 41, 2);		// call by value : 값을 참조하므로 원본은 바뀌지 않고 해제(출력x)
	SetInfo(&studentA, "학생A-2", 41, 2);	// call by address : 주소를 받아 복사 -> 포인트변수
	
	PrintInfo(studentA);
}

※여기서 중요한 포인트는 구조체의 경우 

1) 구조체는 멤버변수들이 많이 있기때문에, 주소에서 멤버(성능)를 참조할때 ' . ' 이 아닌 ' - > ' 로 접근한다는 것

2) 함수를 선언할 때 값을 참조하는지, 주소를 참조하는지..

출력 결과

2. <정수형 변수의 포인터 변수>

#include <iostream>
#include <string>

using namespace std;


// 데이터 타입이 int이냐 Student이냐의 차이일뿐 구조적으론 전혀 차이없다.
// 값에 의한 참조를 한다면 값이 복사되는 것이고 (콜바이밸류)
void PrintInt(int target)
{
	cout << target << endl;
}

void SetInt(int* target, int value)
{
	*target = value;
}

// 주소를 통해 참조를 한다면 원본의 주소를 통해 다이렉트로 참조가능 (콜바이어드레스)
void main()
{
	// 정수형 변수 선언
	int num = 10;
	PrintInt(num);
	SetInt(&num, 50);
	PrintInt(num);
}

출력 결과

※ 여기서 중요한 포인트는 정수형 변수의 경우

- 주소에서 멤버(성능)를 참조할때 포인터 변수를 바로 선언할수있다는 것

728x90

'코딩 1막 <C++개념편>' 카테고리의 다른 글

[C++] 20. 입력  (0) 2022.06.02
[C++] 19. 멤버함수  (0) 2022.06.02
[C++] 17. 구조체  (0) 2022.05.31
[C++] 16. 2차원배열  (0) 2022.05.31
[C++] 15. sizeof()  (0) 2022.05.31