2010-05-27 11 views
2

를 dreferencing하는이 코드의 peice 봐주세요 - 난 컴파일 i는 2 차원 어레이의 시작 어드레스이다 도착하고 * 도착에 대한 동일한 값을 가지고,이 프로그램을 실행2 차원 배열

#include<stdio.h> 
int main() 
{ 
int arr[2][2]={1,2,3,4}; 
printf("%d %u %u",**arr,*arr,arr); 
return 0; 
} 

. 예 : - 1 3214506 3214506

제 질문은 역 참조 arr (* arr)이 arr에 들어있는 주소에 저장된 값을 인쇄하지 않는 이유는 무엇입니까?

+0

배열을 동적으로 할당하면 적절한 결과가 표시됩니다. – Cam

답변

5

* arr은 길이가 2 인 정수 유형 배열이므로 arr과 동일한 주소를 공유합니다. 그들은 둘 다 동일한 위치 인 배열의 시작을 가리 킵니다.

0

C에서 2 차원 배열은 배열에 배열로 표시되지 않습니다. 오히려 실행 시간에 배열 내의 오른쪽 오프셋을 계산하기 위해서는 첫 번째 차원이 필요합니다. 따라서 다차원 배열에서는 항상 마지막 차원을 제외한 모든 차원을 지정해야합니다 (필수는 아닙니다). 예를 들어,

int a[2][3][4]; 

배열 합계 2 개 * 3 개 * 4 요소는 단일 메모리 어레이로서 표현 될 것 같은 배열을 선언하는 경우. 위치 (i, j, k)에있는 요소에 액세스하려고하면 실제로 배열의 요소 3 * i + 4 * j + k에 액세스하게됩니다. 어떤면에서는 1 차원 배열에 "행 나누기"를 넣을 위치를 알기 위해 초기 치수가 필요합니다.

+0

답변에 수정이 있습니다. 다차원 배열을 선언하는 동안 초기 치수는 필요하지 않으며 나머지는 모든 치수가 필요합니다. a가 함수에 전달되면 인수는 int (* a) [3] [4] 또는 int a [] [3] [4] 형식이어야합니다. 컴파일러는 1D 배열의 경계를 끊을 위치를 알아야합니다. 행 수는 신경 쓰지 않습니다. –