inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문

포인터 마무리

2차원 배열과 2중 포인터 호환

401

stopresent

작성한 질문수 2

0

강의를 듣다가 2차원 배열은 2중 포인터와 호환이 안된다고 하셨습니다. 저도 2차원 배열은 결국 1차원 배열이니까 당연히 안되겠지 생각해서 이해했습니다.

 

int arr2[2][2] = { {1,2}, {3,4} };
라는 2차원 배열에서
int* p3 = (int*)arr2;
라는 포인터 변수를 만들고
cout << *p3 << *(p3 + 1) << *(p3 + 2) << *(p3 + 3) << endl;
테스트로 만들어보니 1234가 잘 출력되었습니다.

 

그런데 강의에서
int(*p2)[2] = arr2;
라는 새로운 타입형 변수를 만들어서 (*p2)[0], p2[0][0] 등등 배열처럼 사용하셨는데
연습 겸 이걸 포인터식으로 사용해보려고

 

cout << **p2 << *(*p2 + 1) << *(*p2 + 2) << *(*p2 + 3) << endl;
이런 식으로 테스트 해보니 1234 또 잘 나왔습니다.
여기서 **p2는 2중 포인터인데 왜 워프를 두번타는지 이해가 안되었습니다. 그래서 여러가지 테스트를 해보았습니다.


cout << **(p2 + 0) << *(*(p2 + 0) + 1) << **(p2 + 1) << *(*(p2 + 1) + 1) << endl; 
이것도 1234가 출력되는데 (p2 + 1)이 왜 8바이트만큼 이동하는지, 다시 말해서 [0][0]에서 [1][0]처럼 이동하는게 이해가 안됩니다. 포인터 연산에서 타입 크기 만큼이동한다고 배웠는데
p2의 타입크기는 int[n][m]에서 (4 * m)바이트 인건가요?
그렇다면 *p2의 타입크기는 int 즉, 4바이트 인건가요?
그리고 p2는 2중포인터 변수인가요?

물론 앞으로 사용하지 않을 것 같지만 궁금증이 문득..

C++

답변 1

0

Rookiss


이 부분을 먼저 이해하셔야 합니다.
경고가 뜨긴 하지만 실행해보면 결과는 똑같이 뜹니다.

int arr[2] = {1,2}를 하면 데이터 {1, 2}이 메모리에 연속해서 할당되고,
첫번째 데이터인 {1}의 메모리 주소가 arr이라는 바구니에 들어가게 됩니다.
---> 편의성 이를 [배열 1 법칙]이라고 가칭을 짓겠습니다.
이를 응용해 int arr2[2][2] = {{1,2},{3,4}}를 하면 다음과 같습니다.

arr2[0][2]가 경고에도 불구하고 3이 뜨는 이유가 뭘까요?
그냥 직접 계산을 해보면 됩니다.
arr2[0] = 200번 주소로 이동하게 되고,
200번 주소로 가면 무엇이 있는데?
~에 대한 해답은 양파까기를 통해 int arr2[2][2]
즉 int 2개짜리 배열이 있다고 주장하고 있습니다.

그런데 [배열 1 법칙]에 의해 사실상 데이터가 바로 있는게 아니라 주소가 있기 때문에
(*'200')[2]는 곧 *((*'200')+2)이라서
해석하면 '200'이라는 주소로 워프를 탄 다음,
데이터 크기만큼 두 칸을 이동해서 그 주소로 이동해! 가 됩니다.
그리고 여기서 데이터 크기는 int의 크기는 4바이트가 됩니다. (int가 있는 배열이라 했기 때문)
뭐 좀 복잡한데 요약하면 위와 같습니다



0

stopresent

머릿 속에서 정리가 됩니다! 감사합니다!

visualstudio에서 파일분할관리실습시 설정 문의를 드립니다.

0

561

1

정렬함수 좀 더 확실하게 이해 할 방법이 있을까요?

0

456

1

strcpy() 구현 관련 질문

0

545

1

빌드(망치)를 누르니 이런 오류가 떴습니다. 어떻게 해야 하나요?

0

477

1

클래스 타입의 포인터 질문합니다

0

561

1

입력값을 enum 값에 넣어주는거 이제 막혔나요?

0

505

1

템플릿 특수화 관련 질문

0

393

1

포인터 관련 질문합니다!

0

276

1

Unable to start assembler. Check your settings.

0

852

2

cpu선택

0

552

1

포인터 질문이 있습니다

0

335

1

20:35 에서 구조체 크기에 대한 질문입니다!

0

593

1

iterator 삭제관련

0

419

1

함수 호출을 디스어셈블러로 분석하다가 궁금점이 생겼습니다!

0

316

1

15 분 45초 대 질문

0

319

0

스택 프레임 질문합니다!

2

316

1

오른값 참조 in 게임

0

394

0

동적할당 질문이 있습니다

0

460

1

안녕하세요 메모리에 대해 질문드립니다.

0

314

1

함수객체 의 매개변수

0

370

1

복사생성자

0

441

1

main이나 endl 부분이 주황색으로 표시된건 어떻게 하나요

0

431

1

포인터 실습 강의를 보고 궁금한게 있습니다.

0

360

1

스택 오버플로우

2

804

1