C언어_배열과 포인터의 관계

P4·2023년 5월 2일
0

C언어 기초

목록 보기
18/23
post-thumbnail

배열과 포인터의 관계

#include <stdio.h>

int main(void)
{
    int arr[3] = {5, 10, 15};

    int *ptr = arr;
    
    return 0;
}
  • 만약 arr을 이렇게 선언했다면, arr은 배열의 시작점 주소를 의미함

  • ptr = arr

  • arr[0] = *arr

  • arr[1] = *(arr + 1)

  • arr[2] = *(arr + 2)


예제코드 (배열과 포인터의 관계)

#include <stdio.h>

int main(void)
{
    int arr[3] = {5, 10, 15};

    int *ptr = arr;

    for (int i = 0; i < 3; i++)
    {
        printf("배열 arr[%d]의 값 : %d\n", i, arr[i]);
    }

    for (int i = 0; i < 3; i++)
    {
        printf("포인터 ptr[%d]의 값 : %d\n", i, ptr[i]);
    }

    for (int i = 0; i < 10; i++)
    {
        printf("======");
    }
    printf("\n");

    ptr[0] = 100;
    ptr[1] = 200;
    ptr[2] = 300;

    for (int i = 0; i < 3; i++)
    {
        printf("배열 arr[%d]의 값 : %d\n", i, arr[i]); // arr이라는 것은 정확히는 arr이 가장 처음 시작되는 주소값이라는 것을 가지고 있음
    }

    for (int i = 0; i < 3; i++)
    {
        printf("배열 arr[%d]의 값 : %d\n", i, *(arr + i)); // 이건 그 주소로부터 i번째에 해당하는 녀석의 값을 가져온다는 뜻임
    }

    for (int i = 0; i < 3; i++)
    {
        printf("포인터 ptr[%d]의 값 : %d\n", i, ptr[i]);
    }

    for (int i = 0; i < 3; i++)
    {
        printf("포인터 ptr[%d]의 값 : %d\n", i, *(ptr + i)); // 얘도 똑같음
    }

    for (int i = 0; i < 10; i++)
    {
        printf("======");
    }
    printf("\n");

    /* *(arr + i) == arr[i] 똑같은 표현
    arr == arr배열의 첫번째 값의 주소와 동일 == &arr[0] */

    printf("arr 자체의 값 : %d\n", arr);
    printf("arr[0]의 주소 : %d\n", &arr[0]); // 값을 보면 똑같다는 것을 알 수 있음

    printf("arr 자체의 값이 가지는 주소의 실제 값 : %d\n", *arr);
    printf("arr[0]의 실제 값 : %d\n", &arr[0]);

    return 0;
}

swap (값 바꾸기)

  • swap 함수는 값에 의한 복사

  • swap_addr은 call by address (주소값에 의한 복사)


예제코드 2 (swap)

#include <stdio.h>

void swap(int a, int b);
void swap_addr(int *a, int *b);

int main(void)
{
    int a = 10;
    int b = 20;
    printf("swap함수밖의 a 주소값 : %d\n", &a);

    printf("swap함수 사용 전 --> a : %d, b : %d\n\n", a, b);
    swap(a, b);

    printf("swap함수 사용 후 --> a : %d, b : %d\n\n", a, b);

    /* 이렇게 나오는 이유는 값에 의한 복사 (Call by Value) 때문
    --> 값만 복사한다는 의미, 주소값으로 확인하면 다르게 나옴 */

    for (int i = 0; i < 15; i++)
    {
        printf("======");
    }
    printf("\n\n");

    printf("주소값을 넘겨줘보기\n\n");

    swap_addr(&a, &b);

    return 0;
}

void swap(int a, int b)
{
    printf("swap함수내의 a 주소값 : %d\n", &a); // 이게 값에 의한 복사임
    int temp = a;
    a = b;
    b = temp;
    printf("swap함수내에서 사용 후 --> a : %d, b : %d\n\n", a, b);
}

void swap_addr(int *a, int *b)
{
    int temp = *a;
    *a = *b;
    *b = temp;
    printf("주소값으로 넘겨준 후 --> a : %d, b : %d\n", *a, *b);
} // 주의사항은 함수 처음 선언부터 아래 사용까지 a, b앞에는 전부 *을 붙여줘야 한다는 것

포인터로 배열의 요소값 변경


예제코드 3 (배열의 요소값 변경)

#include <stdio.h>

void changeArray(int *ptr); // 3번째 값을 50으로 바꾸는 함수

int main(void)
{

    int arr2[3] = {10, 20, 30};
    changeArray(arr2);
    for (int i = 0; i < 3; i++) {
        printf("%d\n", arr2[i]);
    }

    return 0;
}

void changeArray(int *ptr) // 위의 swap예제와 동일하게 주소값으로 처리함
// int *ptr = arr2의 주소값 (= &arr2[0])이 됨
{
    ptr[2] = 50;
}
profile
지식을 담습니다.

0개의 댓글