-
배열의 주소와 이름의 관계C언어 2020. 2. 26. 14:53
배열은 특정 자료형으로 이루어진 인스턴스들의 집합체이며 배열의 본질은 메모리의 일정 공간이기 때문에 배열은 메모리의 주소로 식별한다. C언어와 같은 고급 언어는 16진수 체계의 주소 말고 이름이라는 식별자를 통해 배열을 식별하게 되며 여기서 식별자 즉 이름이 가르치는 것은 두가지가 있으며 하나는 식별자를 통해 배열이라는 것을 가르키며 또다른 하나는 식별자는 배열이 시작하는 인스턴스의 첫 번째 메모리의 주소를 가리킨다.
이전 포스트에서 위와 같이 배열에 대해 설명을 한 적이 있다.
아래의 그림을 보면 위에서 설명한 배열의 정의와 맞지 않는 부분이 생길 것 이다.
배열의 이름 => 0, 1, 2 ( 배열의 주소범위 00E7FE64 ~ 00E7FE6C )
배열의 주소 => 0, 1, 2 ( 배열의 주소범위 00E7FE64 ~ 00E7FE6C )
배열의 이름 + 1 => 1 ( 배열의 두번째 인스턴스의 시작 주소 00E7FE68 )
배열의 주소 + 1 => 배열의 범위를 벗어남 ( 배열의 주소범위를 벗어난 00E7FE70 ~ 00E7FE78의 값 )
분명 위의 설명 대로라면 배열을 나타내니 배열의 주소 +1은 0 다음인 1의 값이 나타나야 하는데 엉뚱하게 배열을 완전 벗어나버린 값들이 들어가 있는 것을 볼 수 있다.
위의 사실을 통해 배열의 식별자 즉 이름과 배열의 주소는 다른 의미를 같는 다는 것을 확인할 수 있다.
배열의 이름이 피연산자가 될 때 배열 이름은 객체 그 자신이 됩니다. 예를 들면 sizeof(배열 이름) = 배열의 전체 크기인 것 처럼.
그런데 배열의 주소가 피연산자가 되는 경우, 이 때는 타입이 됩니다. 예를 들면 T array[size]면 sizeof(배열 주소) = T*의 크기입니다.
따라서 연산의 결과는 다음과 같다.
1. a_list : 이름 즉 식별자로 접근 했을 시 위의 설명대로 배열 객체 그 자체이기 때문에 해당 배열의 모든 값들을 보여준다 주소는 배열이 시작하는 00E7FE64 이다
2. &a_list : 배열 이름의 주소는 해당 배열이 시작하는 인스턴스의 주소 정보 + 배열이라는 정보를 제공하기 때문에 배열의 모든 값들을 보여준다 주소는 배열이 시작하는 00E7FE64 이다
3. a_list + 1 : 배열의 식별자 + 1을 한 경우이다. 이는 내부적으로 배열의 식별자는 해당 배열을 나타냄으로 배열의 시작 인스턴스로 부터 +1한 위치에 있는 인스턴스의 값을 가져오는 것을 볼 수 있다. 주소는 00E7FE68 2번째 인스턴스가 시작하는 주소이다.
4. & a_list +1 : 배열을 대표하는 주소 + 1 을 한 경우이다 . 이는 위에서 설명 했듯 배열의 주소가 피연산자가 될 경우 배열의 크기를 의미하기 때문에 해당 배열 즉 int 형 인스턴스 3개의 크기를 의미한다. 즉 인스턴스 3개 만큼 1칸 떨어진 경우에 대한 연산이 된다.
위에서 설명한 내용들을 보았을 때 다음과 같이 볼 수 있다.
&a_list[0] 이 의미하는 바는 a_list라는 배열의 첫 번째 인스턴스의 위치 주소를 의미하며
a_list[1] 이 의미하는 바는 a_list는 기준 위치 정보이기 때문에 a_list는 가장 첫 번째 인스턴스의 위치 정보 즉 주소를 가지고 있으며 그로부터 한칸 떨어진 인스턴스의 정보를 가지고 오기 때문에 배열의 두 번째 인스턴스에 담긴 값이 불러와 진다.
a_list == 0x 00E7FE64 ?
그렇다면 a_list 와 0x 00E7FE64이 의미하는 것은 같은가? 라는 의문이 생긴다.
한번 살펴보자
a_list가 가르키는 것은 배열의 시작주소 즉 00E7FE64 이다 따라서 같다고 볼 수 있다. 그런데 a_list는 식별자 이다 따라서 해당 배열을 대표하는 특성을 가지고 있기도 하다.
반면 00E7FE64 라는 주소는 a_list라는 식별자가 붙어있는 위치 주소는 맞지만 해당 배열의 크기를 가리키기도 하며 각 인스턴스중 첫번째 인스턴스의 주소이기도 하다.
따라서 둘은 서로 같은 자료 (00E7FE64) 를 가르키지만 해석하는 방식에 따라 ( 주소인지, 식별자인지 ) 다른 의미의 정보가 될 수 있다.
'C언어' 카테고리의 다른 글
메모리의 구조와 포인터 (0) 2020.03.01 함수 기본 이론 (0) 2020.02.28 프로그램의 성능향상 ( 쇼트서킷 ) (0) 2020.02.24 연산자 (sizeof), 디스어셈블 (0) 2020.02.24 정수의 입력 함수 (scanf), 버퍼의 추상화 (0) 2020.02.19