C언어 배열이름 질문합니다.

조회수 1508회

안녕하세요. c언어를 공부하고 있는 학생입니다. c언어 배열이름에 관해서 궁금증이 생겼는데.

int arr[3] = {99, 77, 55}; 라는 배열을 선언했다고 가정을 하면

arr이라는 변수는 arr[0]의 주소를 가지게 되는 것은 알았습니다.

1) 그런데 arr이라는 변수는 어디에 저장되어있는 건가요? 메모리상에 arr[0] 변수 앞에 있는건가요?

2) arr은 변수가 아닌건가요? &(arr)을 출력해본결과 arr[0]의 주소값하고 똑같이 나오더군요...

결론적으로 arr이라는 변수가 메모리상에 있는 것인지, 있으면 어디에 위치한건지 알고 싶습니다.

1 답변

  • 변수는 특정한 메모리 영역(주소)을 사람이 읽을 수 있는 문자로 표현한 것입니다

    1) 변수는 따로 저장영역을 가지지 않습니다.

    가령 함수 안에서 아래와 같이 선언을 하면

    void func (void) 
    {
        int arr[3] = {99, 77, 55};
    }
    

    스택 포인터가 있는 메모리 영역에 99, 77, 55 숫자를 배열 하고 해당 메모리를 스택 포인터로 부터 계산해서 읽고 쓰게 됩니다

    2) arr 은 변수가 맞습니다. 1)의 예제에서 99의 메모리 주소가 0x1000 이라면 &(arr) 과 arr[0]의 주소 값은 0x1000 입니다

    다시 말씀 드리자면 arr이라는 변수는 값은 실존 하지 않고 컴파일시점에 스택의 상대위치를 통해 접근 하게 됩니다.

    아마도 포인터 변수가 원하시는 답에 가까울것 같은데

    void func (void) 
    {
        int arr[3] = {99, 77, 55};
        int* arr_ptr = arr;
    }
    

    위의 형태에서 99 메모리 주소가 0x1000이라면 메모리 상에 99, 77, 55, 0x1000 값이 순서데로 들어 가며 arr_ptr이 arr의 주소 값을 가지게 됩니다

    • (•́ ✖ •̀)
      알 수 없는 사용자

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)