dlrkddnr2718   2년 전

실행 결과는 일단 

0x61ff00

0x61ff00

0x61ff00
4 4 4

입니다..제가 궁금한 점은, v는 배열의 이름이고, 이는 배열의 첫번째 요소가 보관된 메모리 블록의 주소를 가리킵니다. 그리고 v[0] 는 배열의 첫 번째 열이 보관된 메모리 블록의 주소를 가리킵니다. 그리고 &v[0][0] 은 배열 v의 첫번째 요소가 보관된 메모리 블록의 주소를 가리킵니다. 그런데 크기를 구해 보니 전부 4바이트고, 메모리 주소도 모두 같습니다. 배열의 첫 번째 요소가 보관된 메모리 블록과 배열의 첫 번째 열이 보관된 메모리 블록의 주소값이 같으면 같은 메모리 블록 안에서 2개의 값을 처리하는 건가요..? 

그래서 2차원 배열의 메모리 구조가 궁금합니다. 근데 깊이 생각하다 보니 뭔가 이해하기가 어려워서 혹시 제가 배열이나 포인터, &연산자에 대한 이해가 부족하다면 말씀해 주시면 감사드리겠습니다. 

dustkd1004   2년 전

2차원배열도 사실 메모리에 연속적으로 할당되어있습니다.

때문에 2차원 배열의 시작주소, 첫번째 행의 시작주소, 첫번째 원소의 주소가 모두 동일한 값이죠.

이 링크가서 읽어보시면 좀 더 이해하기 쉬울 거에요.

https://codingdog.tistory.com/...

wlsxkr77   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 는 모두 같은 바이트를 같습니다.

dlrkddnr2718   2년 전

이해가 된 줄 알았는데 또 궁금한 점이 생겼습니다. 그러면, 배열의 이름 v는 이중 포인터인 것 같은데, 그럼 그 이중 포인터 안에 v[0]의 주고와, v[1]의 주소가 모두 들어가야 하는 것 아닌가요?? 그러면 하나의 포인터 안에 두개의 주솟값이 들어가는 건가요? 아니면 그냥 시작 주소로만 사용하자! 라고 약속한 건가요??

위의 소스 코드에서, 아래의 소스 코드를 추가했더니 뭔가 또 꼬인 기분입니다..

cout << v[1] << " " << &v[1] << " " <<  &v[1][0] << endl; /// 모두 같은 값을 출력할 것이다...?
cout << *(&v[1]) << endl;

fblood53   2년 전

포인터 안에는 배열의 첫번째 요소가 들어가지 않나요? 그것만 들어가있다면 나머지 주소는 연속적으로 할당되어있어서 포인터 연산으로 찾을 수 있기에 그렇게 하는 것으로 알고있습니다.

int a[10] = {0};

int* pa = a;

일 경우 pa 는 a의 첫번째 요소를 주소로 가지고

pa++; 을 하면 두번째 요소를 주소로 가지는 것이지요

댓글을 작성하려면 로그인해야 합니다.