const는 변수를 상수화 하기 위한 선언이다. 포인터 변수에도 const 선언이 가능하다.

#include <stdio.h>

int main(void)
{
    int num = 20;
    const int * ptr = &num;
    // *ptr = 30;   // 컴파일 에러
    num = 30;

    printf("test\n");
    return 0;
}

위 코드와 같이 const 선언한 포인터 변수가 가리키는 변수에 저장된 값을 변경하는 것은 허용되지 않는다. 그러나 num변수로 직접 값을 변경하는 것은 가능하다. 

다음 코드와 같이 const 선언은 포인터 변수의 이름 앞에 올 수 도 있다.

int * const ptr = &num;

위와 같이 변수 이름 앞에 const 선언을 했을 경우에는 주소 값의 변경이 불가능하다. 한 번 가리키기 시작한 변수를 끝까지 가리켜야 한다는 것이다. 가리키는 다음과 같이 가리키는 대상에 대한 저장된 값의 변경은 가능하다.

*ptr = 30;

다음과 같이 const선언을 하게 되면 주소값의 변경과, 가리키는 대상이 저장된 값 모두 변경이 불가능하다.

const int * const ptr = &num;

 

'Language > C, C++' 카테고리의 다른 글

[C] 3차원 배열  (0) 2020.12.26
[C] 2차원 배열  (0) 2020.12.24
[C] Call - by - value, Call - by - reference  (0) 2020.12.20
[C] 함수 인자로 배열 전달  (0) 2020.12.20
[C] 포인터 배열  (0) 2020.12.19

함수를 호출할 때 단순히 값을 전달하는 형태의 함수 호출을 Call-by-value 라 하고, 메모리의 접근에 사용되는 주소값을 전달하는 형태의 함수 호출을 Call-by-reference라 한다.  배열을 함수의 인자로 전달하는 경우는 배열의 주소값을 전달받으니 Call-by-reference 이다. 

 

#include <stdio.h>

void Swap(int n1, int n2)
{
    int tmp = n1;
    n1 = n2;
    n2 = tmp;
    printf("n1 n2 : %d %d\n", n1, n2);
}

int main(void)
{
    int num1 = 10, num2 = 20;
    printf("num1 num2 : %d %d\n", num1, num2);

    Swap(num1, num2);
    printf("num1 num2 : %d %d\n", num1, num2);
    return 0;
}
/* output : 
num1 num2 : 10 20
n1 n2 : 20 10
num1 num2 : 10 20
*/
#include <stdio.h>

void Swap(int * ptr1, int * ptr2)
{
    int tmp = *ptr1;
    *ptr1 = *ptr2;
    *ptr2 = tmp;
}

int main(void)
{
    int num1 = 10, num2 = 20;
    printf("num1 num2 : %d %d\n", num1, num2);

    Swap(&num1, &num2);
    printf("num1 num2 : %d %d\n", num1, num2);
    return 0;
}
/* output : 
num1 num2 : 10 20
num1 num2 : 20 10
*/

위 두 코드를 보면 첫 번째 코드는 Call-by-value 방식이고, 두 번째 코드는 Call-by-reference 방식이다. 첫 번째 코드는 값의 변경이 매개변수 n1과 n2에서만 일어나 num1과 num2의 값에는 영향을 미치지 않는다. 매개변수 사이에서만 값의 변환이 일어났다. 두 번째 코드는 주소값을 인자로 받아 주소값에 직접 접근하여 main함수의 num1과 num2의 값도 변경되었다.

'Language > C, C++' 카테고리의 다른 글

[C] 2차원 배열  (0) 2020.12.24
[C] 포인터에서 const 사용  (0) 2020.12.20
[C] 함수 인자로 배열 전달  (0) 2020.12.20
[C] 포인터 배열  (0) 2020.12.19
[C] 문자열 포인터  (0) 2020.12.18

배열을 통째로 함수의 인자로 전달하는 것은 불가능하다. 그러나 배열을 함수의 인자로 전달하면 배열 시작점의 주소값이 전달 되기 때문에 함수의 매개변수를 포인터 변수로 선언하면 포인터 변수를 이용하여 배열에 접근할 수 있다.

#include <stdio.h>

void ShowArrayElem(int * param, int len)
{
    for(int i = 0; i<len; i++){
        printf("%d ", param[i]);
    }
    printf("\n");
}

int main(void)
{
    int arr1[] = {1,2,3};
    int arr2[] = {4,5,6,7,8};
    ShowArrayElem(arr1, sizeof(arr1)/4);
    ShowArrayElem(arr2, sizeof(arr2)/4);
    return 0;
}

/* output : 
1 2 3 
4 5 6 7 8
*/

 

#include <stdio.h>

void ShowArrayElem(int * param, int len)
{
    for(int i = 0; i<len; i++){
        printf("%d ", param[i]);
    }
    printf("\n");
}

void AddArrayElem(int * param, int len, int add)
{
    for(int i = 0; i < len; i++)
    {
        param[i] += add;
    }
}

int main(void)
{
    int arr[3] = {1,2,3};
    AddArrayElem(arr, sizeof(arr)/4, 1);
    ShowArrayElem(arr, sizeof(arr)/4);

    AddArrayElem(arr, sizeof(arr)/4, 2);
    ShowArrayElem(arr, sizeof(arr)/4);
    return 0;
}
/* output : 
2 3 4 
4 5 6
*/

위 코드와 같이 주소 값만 알면 배열에 저장된 값의 변경도 가능하다.

 

배열을 함수의 인자로 전달받을 때는 다음과 같은 선언도 가능하다. int * param과 동일한 의미이다.

void ShowArrayElem(int param[], int len)

 

'Language > C, C++' 카테고리의 다른 글

[C] 포인터에서 const 사용  (0) 2020.12.20
[C] Call - by - value, Call - by - reference  (0) 2020.12.20
[C] 포인터 배열  (0) 2020.12.19
[C] 문자열 포인터  (0) 2020.12.18
[C] 포인터 연산  (0) 2020.12.17

+ Recent posts