2차원배열도 사실 메모리에 연속적으로 할당되어있습니다.
때문에 2차원 배열의 시작주소, 첫번째 행의 시작주소, 첫번째 원소의 주소가 모두 동일한 값이죠.
이 링크가서 읽어보시면 좀 더 이해하기 쉬울 거에요.
2차원배열도 사실 메모리에 연속적으로 할당되어있습니다.
때문에 2차원 배열의 시작주소, 첫번째 행의 시작주소, 첫번째 원소의 주소가 모두 동일한 값이죠.
이 링크가서 읽어보시면 좀 더 이해하기 쉬울 거에요.
v[2][3] = {0, } 일 경우
v[0][0] | v[0][1] | v[0][2] | v[1][0] | v[1][1] | v[1][2] --> 이름은 2차원 배열이지만 이렇게 선형적으로 2차원 배열이 저장되어 있습니다.
<---------- v[0] 배열 -----------> <---------- v[1] 배열 ---------->
<------------------------------- v 배열 --------------------------->
즉 v[0][0]의 주소인 &v[0][0], v[0]의 시작 주소인 v[0], v의 시작 주소인 v는 같습니다.
그리고 주소값(포인터)을 나타내는 &v[0][0], &v[0], &v 는 모두 같은 바이트를 같습니다.
이해가 된 줄 알았는데 또 궁금한 점이 생겼습니다. 그러면, 배열의 이름 v는 이중 포인터인 것 같은데, 그럼 그 이중 포인터 안에 v[0]의 주고와, v[1]의 주소가 모두 들어가야 하는 것 아닌가요?? 그러면 하나의 포인터 안에 두개의 주솟값이 들어가는 건가요? 아니면 그냥 시작 주소로만 사용하자! 라고 약속한 건가요??
위의 소스 코드에서, 아래의 소스 코드를 추가했더니 뭔가 또 꼬인 기분입니다..
cout << v[1] << " " << &v[1] << " " << &v[1][0] << endl; /// 모두 같은 값을 출력할 것이다...? cout << *(&v[1]) << endl;
댓글을 작성하려면 로그인해야 합니다.
dlrkddnr2718 2년 전
실행 결과는 일단
0x61ff00
0x61ff00
0x61ff00
4 4 4
입니다..제가 궁금한 점은, v는 배열의 이름이고, 이는 배열의 첫번째 요소가 보관된 메모리 블록의 주소를 가리킵니다. 그리고 v[0] 는 배열의 첫 번째 열이 보관된 메모리 블록의 주소를 가리킵니다. 그리고 &v[0][0] 은 배열 v의 첫번째 요소가 보관된 메모리 블록의 주소를 가리킵니다. 그런데 크기를 구해 보니 전부 4바이트고, 메모리 주소도 모두 같습니다. 배열의 첫 번째 요소가 보관된 메모리 블록과 배열의 첫 번째 열이 보관된 메모리 블록의 주소값이 같으면 같은 메모리 블록 안에서 2개의 값을 처리하는 건가요..?
그래서 2차원 배열의 메모리 구조가 궁금합니다. 근데 깊이 생각하다 보니 뭔가 이해하기가 어려워서 혹시 제가 배열이나 포인터, &연산자에 대한 이해가 부족하다면 말씀해 주시면 감사드리겠습니다.