본문 바로가기

강의자료/C/C++

027. 참조변수에 대해서 이해하자.

◈ 이 글은 강의를 위하여 제가 직접 작성한 내용입니다. 따라서 퍼가실 경우, 출처를 명확히 해주시기 바랍니다!!
◈ This ariticle was written by me for teaching. So if you want to copy this article, please clarify the source!!


참조변수의 특징에 대해서 이해하고, 포인터변수와의 차이점에 대해서 알아보자.
// 참조는 선언시 무조건 초기화를 해야 한다.
// 참조는 한번 정의하면 그 대상을 변경할 수 없다.
// 참조는 선언시 타입이 일치해야만 한다.

// 아래 코드를 참조을 이용한 코드로 변경하시오.
/*
#include  
using namespace std;

void swap(int* a, int* b);

void main( )
{
	int m=5;
	int n=100;
	cout << "앞쪽 " << m << " 뒤쪽 " << n << endl;
	swap(&m, &n);
	cout << "앞쪽 " << m << " 뒤쪽 " << n << endl; 
}

void swap(int* a, int* b)
{
	int temp = *a;
	*a=*b;
	*b=temp;
}
*/

/*
#include  
using namespace std;

void swap(int& a, int& b);

void main( )
{
	int m=5;
	int n=100;
	cout << "앞쪽 " << m << " 뒤쪽 " << n << endl;
	swap(m, n);
	cout << "앞쪽 " << m << " 뒤쪽 " << n << endl; 
}

void swap(int& a, int& b)
{
	int temp = a;
	a=b;
	b=temp;
}
*/

#include  
using namespace std;

void swap(int* a, int* b);
void swap(int& a, int& b);

void main( )
{
	int m=5;
	int n=100;
	cout << "앞쪽 " << m << " 뒤쪽 " << n << endl;
	swap(&m, &n);
	cout << "앞쪽 " << m << " 뒤쪽 " << n << endl;
	swap(m, n);
	cout << "앞쪽 " << m << " 뒤쪽 " << n << endl; 
}

void swap(int* a, int* b)
{
	int temp = *a;
	*a=*b;
	*b=temp;
}
void swap(int& a, int& b)
{
	int temp = a;
	a=b;
	b=temp;
}

/*
void main()
{
	int a = 100;
	int* b = // 포인터 이용 : getNum()함수에 a를 넣고 함수의 리턴값으로 다시 a를 받으세요.

	*b = 1000;

	cout << a << endl;

	int c = 100;
	int& d = // 참조 이용 : getNum()함수에 c를 넣고 함수의 리턴값으로 다시 c를 받으세요.

	d = 2000;

	cout << c << endl;

	cout << endl;
}
*/

#include 
using namespace std;

int* getNum(int* num)
{
	return num;
}

int& getNum(int& num)
{
	return num;
}

void main()
{
	int a = 100;
	int* b = getNum(&a);

	*b = 1000;

	cout << a << endl;

	int c = 100;
	int& d = getNum(c);

	d = 2000;

	cout << c << endl;

	cout << endl;
}

배열은 참조변수로 받을 없고, 포인터 변수로 받아야 한다.
#include 
using namespace std;

// const 주의사항 : 일반적으로 변수를 만들 때 사용하는 const는 상수를 만든다는 의미지만, 
// 함수의 인자에 사용되는 const는 상수가 아닌 인자로 들어온 변수를 변경하지 않겠다는 의미이다. 
// -> 이는 참조 변수를 받을 때 주로 사용된다.

void copy(int* target, int* source, const int counts );
void reverse(int* target, int* source, const int counts );

void main()
{
	int num[]={8,54, 11,-45,43,26,66,12,33, 65};
	const int n=sizeof(num)/sizeof(int);
	int after[n];  //n --> 배열 선언시 상수 사용 
	for(int i=0; i < n; i++)
	{
		cout << num[i] << "\t"; 
	}  
	//copy(after, num, n);
	reverse(after, num, n);    //역순 복사
	for(int i=0; i < n; i++)
	{
		cout << after[i] << "\t"; 
	}

	cout << endl;
}

//소스 배열에서 타겟 배열로 일대일 복사  
void copy(int* target, int* source, const int counts )
{  
	for(int i=0; i < counts; i++)
	{
		target[i] = source[i];
	}   
}

//소스 배열에서 타겟 배열로 역순으로 일대일 복사  
void reverse(int* target, int* source, const int counts )
{  
	for(int i=0; i < counts; i++)
	{
		target[i] = source[counts-1-i];
	}

	/*for(int i=0, j=counts-1; i < counts; i++, j--)
	{
	target[i] = source[j];
	}   */
}