본문 바로가기

교육 노트/C++ 기초강의

[C++ 때려잡기] C++ 기초강의 4-4 포인터와 배열의 상관관계, call by pointer

2018/08/26 - [교육 노트/C++ 기초강의] - [C++ 때려잡기] C++ 기초강의 4-1 간단한 구조체

2018/08/26 - [교육 노트/C++ 기초강의] - [C++ 때려잡기] C++ 기초강의 4-2 배열과 다중배열

2018/08/26 - [교육 노트/C++ 기초강의] - [C++ 때려잡기] C++ 기초강의 4-3 마침내 포인터, 포인터 기초


기존에 배열의 이름에 [index] 를 붙여 해당하는 변수를 사용해왔다

그러면 배열의 이름 자체는 무엇일까?






여기서 배열과 포인터의 상관관계가 나온다


1. 배열과 포인터의 상관관계



ps. 정확히는 포인터 변수도 아니고 포인터 상수라고 부르며(변경불가능) 포인터 상수도 정확한 표현은 아니지만 주소값을 가르키므로 포인터라고 생각하고 있으면 편하다.



배열의 이름은 포인터이고 포인터 산술 연산에 의하여 +1을 하면 다음 배열의 이름을 가르키게된다


따라서 다음과 같이 사용될수있다.






해당 방법을 이용하여 배열과 포인터를 자유롭게 사용할수있다.



그럼 다중배열에서의 상관관계는 어떻게 될까?



설명은 생략하도록 하겠다. 직접 확인해 보면 좋을것이다.




2. call by pointer

포인터 변수를 함수의 파라미터로 넘기면 어떻게 될까

-> 다른 변수처럼 값이 복사되어 넘어간다.
-> 즉 주소값이 복사되어 넘어간다,



다른변수와 동일하게 작동하게 되는데 여기서 한가지 중요한점이 생긴다


-> 그럼 복사된 주소값이 가리키는 곳은?


주소값이 복사되 넘어가는것이므로 주소값자체는 복사되었지만 복사된 주소값이 가르키고 있는 메모리의 위치는 동일하다.



pointer를 파라미터로 받는 swap함수가 있을때 x_p, y_p는 swap함수내에서만 사용하는 변수이므로 메모리에 새롭게 할당되게 된다.


참고로 return 0; 은 오타이다 ㅜ return; 으로 변경


하지만 값복사가 되는것은 주소값이고 결국 x_p 는 x의 주소값을 가르키게된다


그래서 x_p를 변경하면 main 함수에서 아무런 영향이 없지만

x_p가 가리키고있는 값을 변경하면 main 함수의 x가 변경되게된다.



이렇게 포인터 값을 넘기는것을 call by pointer (call by address) 라고 한다

해당 방식을 이용해서 swap함수를 직쩝 짜보아라







3. 배열 파라미터

배열의 이름은 포인터라고 했고

포인터를 넘겨서 값을 바꾸면 원래 값이 수정된다고 했다

그럼 배열을 파라미터로 넘기면 어떻게 될까?


배열의 이름은 포인터이기 때문에
call by pointer로 동작한다
-> 값이 바뀐다!

#include <iostream>
#include <ctime>
using namespace std;

void AddOneAllElementInArray(int arr[], int size)
{
    for (int i = 0; i < size; i++)
    {
        arr[i]++;
    }
}
int main()
{
    int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
    AddOneAllElementInArray(arr, 10);

    for (int i = 0; i < 10; i++)
    {
        cout << arr[i] << endl;
    }
    return 0;
}



여기서 함수의 파라미터로 int arr[] 로 넘겨준거처럼 여기 안에는 size를 지정할 필요가없다. 어차피 포인터이기때문에 산술연산이나 [index] 등으로 사용할때 넘어가는 크기(int 형 4바이트) 만 알면된다.

그리고 함수내에서는 포인터 주소만 들어왔기때문에 크기를 알수없으므로 size를 알려주는 int size를 파라미터로 추가했다.


하지만 이중배열이나 삼중배열등을 넘겨주기 위해서는

상위 배열의 산술연산이나 [index]에서 넘어가는 사이즈를 알아야하므로


void MultiArray(int arr[][10], int size)


과 같이 뒤에 사이즈는 알려주어야 한다.




728x90