Tech Blog/C and C++

C언어 - 포인터와 배열

EXPRESSIONS HAVE POWER 2021. 6. 9. 17:32

1. 포인터와 배열로 값 호출하기 (서로 비교)

#include <stdio.h>

int main(){
    // 배열
    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]);
    }
    return 0;
}

실행결과 

배열 arr[0] 의 값 : 5
배열 arr[1] 의 값 : 10
배열 arr[2] 의 값 : 15
배열 ptr[0] 의 값 : 5
배열 ptr[1] 의 값 : 10
배열 ptr[2] 의 값 : 15

1. 포인터와 배열로 주소 및 값 호출하기 (서로 비교)

 

#include <stdio.h>

int main(){
    // 배열
    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]);
    }

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

    for(int i=0; i<3;i++)
    {
        // printf("배열 arr[%d] 의 값 : %d\n", i, arr[i]);
        printf("배열 arr[%d] 의 값 : %d\n", i, *(arr + i));
    }
    for(int i=0; i<3;i++)
    {
        printf("배열 ptr[%d] 의 값 : %d\n", i, *(ptr + i));
    }
    // *(arr + i) == arr[i] 똑같은 표현
    // arr == arr 배열의 첫번째 값의 주소와 동일 == &arr[0]
    printf("arr 자체의 값 : %d\n", arr);
    printf("arr[0] 의 주소 : %d\n", &arr);

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

    // *& 는 아무것도 없는 것과 같다. &는 주소이며, *는 그 주소의 값이기 때문에 
    // *& 는 서로 상쇄된다. 
    printf("\n\n*&는 서로 상쇄된다.\n\n");
    printf("arr[0]의 실제 값: %d\n", *&*&*&*&*&arr[0]); 
    printf("arr[0]의 실제 값: %d\n", arr[0]); 
    return 0;
}

실행결과

배열 arr[0] 의 값 : 5
배열 arr[1] 의 값 : 10
배열 arr[2] 의 값 : 15
배열 ptr[0] 의 값 : 5
배열 ptr[1] 의 값 : 10
배열 ptr[2] 의 값 : 15
배열 arr[0] 의 값 : 100
배열 arr[1] 의 값 : 200
배열 arr[2] 의 값 : 300
배열 ptr[0] 의 값 : 100
배열 ptr[1] 의 값 : 200
배열 ptr[2] 의 값 : 300
arr 자체의 값 : -427641220
arr[0] 의 주소 : -427641220
arr 자체의 값이 가지는 주소의 실제 값: 100
arr[0]의 실제 값: 100


*&는 서로 상쇄된다.

arr[0]의 실제 값: 100
arr[0]의 실제 값: 100

3. 포인터로 배열 값 변경해보기.

#include <stdio.h>

void changeArray(int * ptr);

int main(){
   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)
{
    ptr[2] = 50;
}

실행결과

10
20
50

#include <stdio.h>

void changeArray(int * ptr);

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

void changeArray(int * ptr)
{
    ptr[2] = 50;
}

- main함수내에서  changeArray 함수를 사용할 때 

changeArray(arr2);의 실행결과와

changeArray(&arr2[0]);의 실행결과가 같다.

 

그렇기에,

첫 번째 해당하는 배열의 주소를 던져서 거기로부터 3번째 위치의 배열의 값을 바꾸는 것은 올바른 동작이라고 볼 수 있다.