배열과 포인터는 밀접한 관계가 있다. 우선 포인터를 통해서 힙공간에 배열을 동적으로 할당할 수 있다.
int Size = 5;
int* iArray = new int[5];
delete[] iArray;
위 코드는 5칸짜리 정수형 배열을 만드는 코드이다. 이때 iArray 포인터 변수는 스택 공간에 만들어지지만 실제 배열은 힙공간에 만들어진다. 일반 배열 선언 시 배열이 스택공간에 만들어지는 것과는 차이가 있다. new <타입>[]을 통해서 동적할당이 가능하고 마찬가지로 delete[]를 통해서 꼭 해제해주어야 한다.
int myArray[5];
반대로 배열 선언시 배열의 이름은 포인터의 역할을 한다. 위 코드의 myArray라는 이름은 배열의 첫번째 원소인 myArray [0]을 가르치는 포인터이다. 이 때문에 함수에 배열을 전달할 때 약간의 혼란이 발생할 수 있다.
int a = 5;
int myArray[] = {1, 2, 3, 4, 5};
int* pArray = new int[a];
myfunction(a, myArray, pArray);
delete[] pArray;
위 코드에서 함수에서 정수형 변수, 배열, 포인터가 함수가 전달된다. 함수에 파라미터 전달 방법에는 해당 값의 복사본을 전달하는 pass by value 형식과 주솟값 자체를 전달하는 pass by reference 형태가 있는데 전자의 경우 함수 내에서 변숫값을 바꾸어도 함수 외부에서는 영향을 받지 않지만 후자의 경우 함수 내부에서 바꾼 것이 외부에도 반영이 된다.
따라서 위 3가지 파라미터에서 a와 같은 일반 변수는 pass by value 형태로 전달되고 pointer인 pArray는 주솟값이므로 당연히 pass by reference 형태로 전달된다. 그리고 myArray인 배열의 경우 myArray라는 이름이 배열의 첫번째 원소를 가르키는 포인터이므로 pass by reference로 전달된다. 이 때문에 함수에 배열을 전달할 경우 함수 내부에서 변경한 배열 값이 외부에서도 반영되므로 주의할 필요가 있다.
'C++' 카테고리의 다른 글
C++ - const (0) | 2023.01.29 |
---|---|
C++ - 스마트 포인터 (0) | 2023.01.28 |
C++ - pointer (0) | 2023.01.23 |
C++ - Initializer_list (0) | 2023.01.22 |
C++ 기초(반복문) (0) | 2023.01.21 |