#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;
}
그래서 조사식에서 배열에 이름을 넣으면 값에 주소가 보여진다.