본문 바로가기
👨‍🏫Study/C++

[C++] 07 - 참조(reference), 포인터(Pointer) 변수

by 코푸는 개발자 2021. 8. 5.
728x90
'*', '&' 기호들의 의미

&x: x의 주소값을 반환
int* px: (int*)는 정수형 변수의 메모리 주소값을 저장하는 data type (px는 주소값을 저장하는 변수)
-> 포인터형 변수(주소값을 저장하는 변수)
*px: px에 저장된 주소값으로 jump

int main() {
	int x = 10;
	int* px = &x;//px라는 포인터형 변수에 x의 주소값을 할당


	cout << &x << '\t' << endl;//&를 붙이면 16진수로 저장된 주소값이 나옴
	//x의 주소값이 나온다
	cout << px << '\t' << *px << endl;
	//*를 붙여주면 주소값이 가지고 있는 변수를 반환해줌
	cout << &px << endl;//px의 저장 주소
		return 0;
}

 

참조(reference)

pass by value: int a = x;int b = y;
pass by ref. : int& a = x;int& b = y;(a=x,b=y)
pass by addr.: int* a = &x; int* b = &y;

void swap(int* a, int* b) {//&를 안붙이면 연결이 안됨
	*a = *a + *b;
	*b = *a - *b;
	*a = *a - *b;//격을 맞춰주기
}

int main() {
	int x = 10, y = 20;

	cout << x << '\t' << y << endl;
	swap(&x, &y); //swap(x,y) ->이렇게해도 작동 smart compiler로 인해 가능
	cout << x << '\t' << y << endl;
	
	return 0;
}

 

함수 포인터
int sum(int a, int b) {return a + b;}
int mult(int a, int b) { return a * b;}//(함수도 주소값을가지고 있다.->시작 주소값)
//int* px
int evaluate(int(*f)(int, int), int a, int b) {
	return f(a, b);
}

int main() {
	int(*func)(int, int);//함수 포인터 입력 정수 2개 출력 정수1개를 의미 위에 정의함 함수와 형태를 동일시 해줘야함
	//이점 
	func = &sum;//위에 evaluate과 동형이다.
	cout << func(10, 20) << endl;

	func = &mult;
	cout << func(10, 20) << endl;

	cout << evaluate(&sum, 10, 20) << endl;
	cout << evaluate(&mult, 10, 20) << endl;
	return 0;
}

 

예시
#include <iostream>
#include <vector>

using namespace std;

void print(const vector<int>& vec) {//pass by value -> 자료수가 적을 때는 상관없지만 자료가 많으면 비효율..
	for (int i = 0; i < vec.size(); i++)//따라서 &를 붙여 pass by ref.로 해줌 (효율적으로 사용)
		cout << vec.at(i) << '\t';//const -> vector안에 값을 고정. 바뀌는 것을 방지할 수 있다.
	cout << endl;
}

int sum(const vector<int>& vec) {//누적 함수
	int result = 0;
	for (int elem : vec)
		result += elem;

	return result;
}

int main() {
	//			index:0, 1, 2, 3
	vector<int> vec{ 10, 20, 30, 40 };
	print(vec);

	vec[0] = 100;
	vec.at(1) = 200;//vec내에 존재하는 인덱스를 사용해야함.
	print(vec);

	vec[0] = 100;//원시적 바로 메모리공간에 저장
	vec.at(1) = 200;//함수처럼 동일한 안전성을 가짐.
	print(vec);

	vec.push_back(50);//vector 맨뒤에 자료추가
	print(vec);
	vec.pop_back();//vector 맨뒤에 있는 원소 제거
	print(vec);

	//int& elem = vec[0] -> for문의 body 실행 &를 붙여 elem값과 vec값이 동일시됨.
	//int& elem = vec[1] -> for문의 body 실행
	//int& elem = vec[2] -> for문의 body 실행
	for (int& elem : vec)//벡터의 원소들을 가장 처음부터 끝까지 아래를 실행한다.
		cin >> elem;

	// int elem = vec[0] -> for문의 body 실행 elem값을 바꿔도 vec값은 변화 없음.
	// int elem = vec[1] -> for문의 body 실행 단순 값을 복사함...
	// int elem = vec[2] -> for문의 body 실행
	for (int elem : vec)
		cout << elem << '\t';
	cout << endl;

	cout << "sum: " << sum(vec) << endl;

	return 0;
}
728x90

댓글