부탁해요!

왜 이차원 배열 int a[5][5]에서 a와 *a는 왜 같은 주소값을 가지나요?

a는 자기자신을 참조하는 포인터인가요..?

yukariko   8달 전

a는 int [5][5] 자료형을 가진 변수이고,

*a 는 int[5] 자료형을 가진 변수입니다.

따라서 둘 모두 포인터가 아닌 배열입니다.

두 주소가 같은 이유는, 배열이 연속된 메모리 공간을 차지하기 때문입니다.

a가 1000번지 부터 1100번지까지 라고 한다면,

a[0] 은 1000번지부터 1020번지 까지

a[1] 은 1020번지부터 1040번지 까지 ...

이런식으로 이어져있죠. 참고로 *a 는 a[0] 과 같습니다.

답변 감사합니다!

하나만 더 질문 드리면 int  a[5][5]의 a가 포인터가 아니면

 a에 대해서 a[2][3]을 *(*(a+2)+3)로 표현하는 경우처럼 

a에 대한 *연산자는 어떤 의미를 갖나요? 일반 포인터에 대한 *연산처럼 참조라는 의미가 아닌가요?

yukariko   8달 전

a 는 int [5][5] 형 배열이지만

a + 0 은 int *[5] 형 포인터가 됩니다.

이런 비슷한 예로 1차원 배열을 함수에 넘길때도  int *a 같은 형태로 받죠.

sizeof(a), sizeof(a+0) 을 출력해보시면 그 차이를 이해하실 수 있으실겁니다.

배열과 포인터는 서로 비슷하지만 다른점도 몇몇 존재하는데,

예를들면 2차원 배열을 함수로 넘길때 int **a 같은 형식으로 넘기게 되면 제대로 동작하지 않습니다.

주소를 계산하는 방식에 있어서 둘이 다르기 때문에 문제가 발생합니다.

이에 대한 부연설명은 이곳에.. (https://www.acmicpc.net/blog/view/32)


yukariko   8달 전

참고로 int *[5] 가 아니라 int (*)[5] 입니다. 잘못기입했네요.. int*[5] 는 포인터의 5개 크기의 배열을 의미합니다.

알려주셔서 감사합니다 ㅠ!!

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