포인터와 참조를 통해 구조체나 클래스의 멤버에 접근할 수 있다.

포인터는 ->를 사용하여 멤버에 접근한다.
(*포인터명)으로 접근할 수 있으나 잘 사용하지 않는다.

	Person *ptr = &person;
	ptr->age = 30;
	(*ptr).age = 40;


참조는 기존 구조체,클래스와 같이 사용할 수 있다.
참조변수명.멤버 형식으로 사용가능하다.

	Person &ref = person;
	ref.age = 20;


참조에 포인터를 de-reference해서 값을 넣어줄 수 있다.

	Person ref2 = *ptr;
	ref2.age = 50;

포인터,참조사용 멤버접근 cout찍어보기

#include <iostream>

using namespace std;

struct Person {
	int age;
	double weight;
};

int main()
{
	Person person;
	cout << "addr : " << &person << endl;
	//멤버 선택 연산자
	person.age = 10;
	

	//참조 주소값 가져오기
	Person &ref = person;
	ref.age = 20;
	cout << "addr ref : " << &ref << endl;

	Person *ptr = &person;
	cout << "addr &ptr : " << &ptr << endl;
	cout << "addr ptr : " << ptr << endl;
	ptr->age = 30;
	//()를 꼭 해줘야한다.
	(*ptr).age = 40;

	Person ref2 = *ptr;
	cout << "addr ref2 : " << &ref2 << endl;
	ref2.age = 50;

	return 0;
}

참조변수 Reference variable

꼭 포인터를 사용하여 * 사용하지 않고 참조변수 &를 사용할 수 있다.

참조변수는 참조하고 있는 변수의 주소를 공유한다.
즉, 참조는 변수의 또다른 별명처럼 사용할 수 있다.
참조변수는 반드시 초기화를 해야한다(리터럴은 불가능).

함수에서도 참조변수(reference)를 활용할 수 있다.
파라미터를 복사를 할 필요가 없어 빠르다.
또 주소를 전송하기에 함수에서 값을 변경할 수 있다.

#include <iostream>

using namespace std;

void doSomething(int &n)
{
	n = 10;
	cout << "In doSomething : " << n << endl;
	cout << "In doSomething : " << &n << endl;
}
void doSomethingPointer(int *n)
{
	*n = 10;
	cout << "In doSomethingPointer : " << n << endl;
	cout << "In doSomethingPointer : " << &n << endl;
}

struct SubA {
	int v1;

};

struct A {
	int v1;
	SubA subA;
};

int main()
{

	A a;
	a.subA.v1 = 3;
	cout << a.subA.v1 << endl;
	//구조체에서 참조를 활용할 수 있다.
	int &v1 = a.subA.v1;
	v1 = 4;
	cout << a.subA.v1 << endl;


	int val = 5;
	//파라미터로 int자료형을 보내면 복사가 된다.
	doSomething(val);
	cout << val << endl;
	cout << &val << endl;

	//파라미터로 참조변수를 보내면 복사가 되지 않는다.
	//즉, 값이 변경 가능하다.
	doSomethingPointer(&val);
	cout << val << endl;
	cout << &val << endl;

	//포인터에서 참조변수를 사용가능하다.
	int *ptr = nullptr;
	ptr = &val;

	//참조 
	int &ref = val;

	ref = 10;
	cout << ref << endl;
	cout << val << endl;

	//const활용
	const int val2 = 3;
	//불가능하다.
	//int &ref2 = &val2;
	const int &ref2 = val2; 

	return 0;
}

함수에 파라미터로 const 참조변수를 사용하면 편해진다.

그냥 참조변수에 대입하는 값은 L_Value만 가능하다.

const를 사용하면 L_Value만 아닌 연산도 가능해진다.

 

#include <iostream>

using namespace std;

//참조변수
void doSomething(const int &const a) {
	cout << &a << endl;
	cout << a << endl;
}


//포인터
void doSomething2(const int *const a) {
	cout << a << endl;
	cout << *a << endl;
}


int main()
{
	int val = 5;
	
	const int &ref = val;
	int &ref2 = val;

	//포인터,참조변수 두개의 차이

	//그냥 참조변수는 L_Value만 가능하다.
	//int &ref3_1 = 3 + 4;
	const int &ref3 = 3 + 4;
	cout << ref3 << endl;
	cout << &ref3 << endl;

	doSomething(val);
	//ref3의 주소값이 인자가 된다.
	doSomething(ref3);
	doSomething(1 + 3);

	//메모리주소,연산전송이 안된다.
	doSomething2(&val);
	//doSomething2(ref3);
	//doSomething2(1 + 3);
	return 0;
}

 

+ Recent posts