포인터 변수의 활용( return 값 두개이상 받기 )

#include <iostream>

int Increase(int a)
{
	return a + 1;
}

void Increase(int* a, int* b)
{
	*a += 1;
	*b += 1;
}

void Insert(int* a, int* b)
{
	*a = 100;
	*b = 100;
}

int main()
{
	int num1 = 10;
	int num2 = 20;

	//num1 = Increase(num1);
	//num2 = Increase(num2);

	Increase(&num1, &num2);

	return 0;
}

배열을 인자로 함수에 넘기기

배열도 결국 다수의 int 변수의 나열이기 때문에 모든 변수의 주소를 보낼 필요가 없고

시작 주소 하나만 보내면된다. 즉 int arr[0]의 주소만 보내면 된다. 결국 int변수 주소를 보내는 샘과 같다.

여기서 특징은 주소값에 덧셈을 하면 실제 사칙연산이 아니라 포인터 변수의 주소 자료형의 데이터 크기만큼 증가해서 배열처럼 사용이 가능하다.

#include <iostream>

void bbq(int* pArr /*int pArr[10]*/)
{
	*(pArr)		= 100; //pArr[0]
	*(pArr + 1) = 100; // pArr[1]
	*(pArr + 2) = 100; // pArr[2]
	*(pArr + 3) = 100;
	*(pArr + 4) = 100;
	*(pArr + 5) = 100;
	*(pArr + 6) = 100;
	*(pArr + 7) = 100;
	*(pArr + 8) = 100;
	*(pArr + 9) = 100; // pArr[9]
	
	pArr[0] = 200;
	pArr[1] = 200;
	pArr[2] = 200;
	pArr[3] = 200;
	pArr[4] = 200;
	pArr[5] = 200;
	pArr[6] = 200;
	pArr[7] = 200;
	pArr[8] = 200;
	pArr[9] = 200;
}

int main()
{
	int vect[10] = {};

	// 배열의 이름이 해당 배열의 첫번째 변수의 주소와 같다.
	// 그말인즉슨 배열이름은 곧 배열의 시작주소이다.
	bbq(/*&vect[0]*/ vect);

	return 0;
}

포인터 변수를 활용하는 제일 큰 이유는 배열 전체를 복사해서 전달인자로 넘기면 배열의 크기만큼의 변수가 복사를 해야하지만 배열의 주소만 보내면 8바이트(64bit) 만 복사하면 끝난다.

다만 *(pArr + 1) 이런 방식으로 사용하면 상당히 코드를 작성하는데 불편하다.

그래서 문법상 포인터변수는 배열처럼 바로 사용이 가능하다.

다만 주의해야 할 점이 전달된 배열의 크기를 넘어가지 않게 주의해서 사용해야 한다.

배열에 이름은 해당 배열의 시작 주소이다. 그래서 이름을 전달인자로 넘겼을시에 복사가 되는것이 아니라 원본이 그대로 넘어간다. (주의해야한다)

#include <iostream>

void Increase(int pArr[7])
{
		for (int i = 0; i < 7; i++)
		{
				pArr[i]++;
		}
}

int main()
{
		int arr[7] = { 123, 42, 2, 66, 7, 9, 10 };
		
		Increase(arr);

		return 0;
}

그래서 조사식에서 배열에 이름을 넣으면 값에 주소가 보여진다.