본문 바로가기
C

[C] 배열과 포인터 | 포인터와 배열의 관계, 배열 이름을 포인터처럼 사용하기, 포인터를 배열의 이름으로 사용하기

by Lizzie Oh 2022. 10. 22.

포인터와 배열의 관계

💡 배열 이름은 해당 배열의 첫번째 요소의 주소값을 갖는다 

 이를 확인하기 위해 배열을 선언하고 값을 할당한 뒤 각각의 배열 요소 값, 주소, 배열 이름을 printf 해보자. 

#include <stdio.h>

int main(void)
{
    int i ;
    int arr[] = {1,2,3,4,5} ;
    printf("배열 요소 출력 : ");
    for(i=0; i<5 ; i++)
    {
        printf("%d ", arr[i]);
    }
    printf("\n");
    printf("배열 요소의 주소 출력 : ");
    for(i=0; i<5 ; i++)
    {
        printf("%p ",&arr[i]);
    }
    printf("\n");
    printf("배열 이름 출력 : ");
    for(i=0; i<5 ; i++)
    {
        printf("%p", arr);
    }
    printf("\n");
    return 0 ;
}

프로그램 실행 결과 . 배열 이름을 출력한 경우에 메모리 주소가 나온다 (왜 다 나오지...?)

 

즉, 배열의 이름은 배열을 가르키는 포인터이다.(= arr 와 &arr[0] 는 일치) 다만 배열의 이름과 일반적인 포인터의 차이점은 '배열의 이름은 상수' 라는 것이다. 

 

상수의 특징은 변경이 불가하다는 것이다. 따라서 배열의 이름이 가르키는 대상은 프로그램이 종료될 때까지 변경할 수 없다. (배열 이름에 새로운 값을 대입하면 오류가 발생함) 그래서 일반 포인터들은 '포인터 변수' 라 불리지만, 배열의 이름과 같은 포인터는 '포인터 상수'라고 불린다. 

 

배열의 이름을 포인터처럼 사용

배열의 이름은 포인터이기 때문에 일반 포인터와 같이 *연산자와 함께 사용할 수 있다.

#include <stdio.h>

int main(void)
{
    int arr[] = {1,2,3,4,5} ;
    int i ;

    printf("배열 요소 인덱스로 출력 : ");
    for(i=0; i<5 ; i++)
    {
        printf("%d ", arr[i]);
    }
    printf("\n");

    printf("배열 이름을 포인터로 사용하여 배열 요소 출력 : ");
    for(i=0; i<5 ; i++)
    {
        printf("%d ",*(arr+i));
    }
    printf("\n");
    return 0 ;
}

프로그램 실행 결과

 

 

포인터를 배열의 이름처럼 사용

배열의 이름을 포인터로 사용할 수 있을 뿐 아니라, 포인터를 배열의 이름으로 사용할 수도 있다

#include <stdio.h>

int main(void)
{
    int arr[] = {1,2,3,4,5} ;
    int i ;

    int *pTemp = arr; // 포인터 pTemp로 배열의 이름(=배열의 주소)을 대입

    printf("배열 요소 출력 : ");
    for(i=0; i<5 ; i++)
    {
        printf("%d ", pTemp[i]);
    }
    printf("\n");
    return 0 ;
}

프로그램 실행 결과

아래 그림을 활용해서 위의 상황을 보다 잘 이해할 수 있다. 

나혼자 C언어. p313

 

 

 

 

 


Reference

1. C Programming : A Modern Approach, 2/E  K. N. King | W. W. Norton & Company

2. 나혼자 C언어 이창현  | 디지털북스 | 

 

반응형

댓글