2012-09-03 3 views
3

그냥 배열 구조 주위에 내 머리를 얻으려고 나는 피트 니스 기능이 필요합니다. 배열의 C 배열

double fitness[][2][9][11] 

단지 이해 내에서 [2] [9] [11] 배열은 11 3 희미 배열하여 2 9가 될 것이다 : 배열의 배열이다. 괜찮아요.하지만, 저를 버리고 있어요. 이것이 어떻게 배열 구조에 기여합니까? 누군가 나에게 예제 입력을 줄 수 있었 을까? (또는 내가 게시 한 배열이 훨씬 더 작을수록 훨씬 더 작은 차원으로).

대단히 감사합니다.

편집 : 이것은 당신이 차원의 수를 줄일 경우 좀 더 명확하게하는 함수

+0

선언입니까? 함수 매개 변수에 대한? –

+1

이 선언자의 의미는 함수 선언자가 사용되는 곳 (즉, 함수 선언자 또는 변수 정의의 일부)에 따라 다릅니다. –

+1

배열 변수를 선언 할 때 * 가장 바깥 쪽 배열 범위가 이니셜 라이저에서 유추됩니다. 함수 인수로 전달되면 배열은 포인터로 붕괴되므로 가장 바깥에있는 배열 범위 또한 무의미합니다. –

답변

2

에 있습니다. 의 굵게하자, 한 차원 남기고 모두 제거하고, 이것이 않는 것은 불완전 형, 두 배의 알 수없는 숫자의 배열을 선언이다

extern double foo[]; 

을 선언합니다. 명시적인 수의 요소를 제공하면 형식이 완료됩니다. 차이점은 sizeof을 불완전한 유형에 적용 할 수 없다는 점입니다. 컴파일러는 불완전한 유형이므로 크기를 알 수 없습니다.

이제 배열 배열을 선언하면 두 치수를 모두 알 수 없습니다 (예 : double foo[][]). 왜 그런가요? 이전에는 컴파일러가 foo[42]의 위치를 ​​계산할 수 있었기 때문에 double의 크기를 알고 있기 때문에 (double은 완전한 유형이기 때문에). foo[1][42]을 계산하려면 요소 유형의 크기를 알아야합니다. 즉, 요소 ​​유형이 완료되어야합니다. C에서 가장 오른쪽의 치수가 가장 빠르게 변하기 때문에 여기의 요소 유형은 가장 왼쪽 치수 인 double [42]을 제외한 모든 요소에 의해 주어지며 원래 질문에서는 double [2][9][11]입니다.

전체 배열의 크기가 필요하지 않으면 하루가 끝날 때 왼쪽 모서리 공백을 비워 둘 수 있습니다.

2

기본적으로 배열에 몇 개의 행이 있는지 알 필요가 없습니다. 차원이 선언 된 이유는 컴퓨터가 2-D 배열에서 indice가 가리키는 메모리 위치에 액세스 할 수 있도록하기 위해서 다음을 사용합니다 (4-D 배열을 찾을 수는 없습니다)

주소 = 자료 + ((depthindex * col_size + colindex) * row_size + rowIndex에) * Element_Size이

그래서 여기에 작은 예입니다은 우리가 그것을 액세스로 이동합니다 우리가

int myArray[2][2]; 
/* put some values in the array */ 
myFunc(myArray); 

다음 한 말

void myFunc(int array[][2]) 
{ 
    printf("%d\n", &array[1][1]); 
} 
와 같은 기능

기본적으로 myArray [1] [1]에 해당하는 배열 [1] [1]의 주소는 위의 수식을 사용하여 계산됩니다. 해당 주소로 이동하면 4 바이트를 정수로 해석하고 화면에 인쇄합니다. . 함수가 배열에 얼마나 많은 행이 있는지 신경 쓰지 않는 이유는 C가 경계 검사를하지 않는다는 것입니다. 수식을 보면 수식을 사용하여 모든 인덱스의 메모리 주소를 계산하는 방법 만 알면됩니다. 행 수는 필요하지 않습니다 (행 크기는 열 수를 기반으로합니다). 따라서 C는 메소드 선언에서 행 수를 생략하는 것에 만족합니다.이 정보없이 메모리 주소를 계산할 수 있기 때문에