C 배열은 매우 복잡하고 C++가 배열의 작동 방식을 이해하려면 C.와 호환되도록 혼란을 상속 기본 사항은 다음과 같습니다
는
1) 배열 변수는 것을 제외하고는 첫 번째 요소에 대한 포인터로 표현 행동 그것은 상수입니다 (즉, "array = p;"를 수행 할 수 없습니다) 그리고 sizeof (array)는 배열의 크기 (한 요소의 크기와 요소의 수의 곱)를 제공하지만 sizeof (포인터)는 포인터.
int array[5];
int* p = array;
그런 다음 다음과 같은 표현은 해당 : 당신이 배열로 함수의 인수를 정의 할 때
array[0] == *array
sizeof(array) == sizeof(int)*5
sizeof(p) == sizeof(void*)
2), 그것은 항상 첫 번째 요소에 대한 포인터로 전달됩니다. 그리고 그 기능으로 행동합니다. 사실, C는 전달 된 배열의 크기를 무시합니다. 더우기 함수에서 인수를 배열의 요소 또는 배열 요소의 포인터로 정의하는 것은 컴파일러에서 동일하게 간주됩니다. 그래서 :
void func(int array[5]);
void func(int array[]);
void func(int *array);
는 동일한 기능을 선언하고이 기능는 sizeof (배열) == sizeof 연산자 (무효 *) 때문에 그
내부 배열처럼 보이는, 항상 참조에 의해 전달 될 것으로 보인다 첫 번째 요소에 대한 포인터.
이제 다차원 배열은 요소가 배열 인 일차원 배열입니다. C/C++의 혼란스러운 부분은 C/C++에서 일반적인 유형을 정의하는 혼란스러운 방식입니다. 그래서 :
test* array[9][9];
는 C/C++ 타입을 읽어 그 기억하면 식별자로 시작하고 []와() 우선 순위를 가지고, 그래서 어레이 9 개 요소들의 어레이이다 (제 [9]) 배열되는 "test"유형에 대한 포인터 인 9 개 요소 (두 번째 [9]). 이 방법에서 도착 인수하기
:
bool sodoku::theRow(test (*arr)[9][9], int testNumber, int row)
도착 9 "테스트"요소 (9 개)의 배열의 배열에 대한 포인터 (괄호 우선 순위를 변경)된다.
이 "배열"포인터를 포함 특히 때문에, 상기 이전의 "어레이"변수는 매우 다르다 "테스트"도착는 "테스트"요소를 포함하면서보기 BTW
은 다음의 선언을 완전히 동일 ", 언"도 9 "테스트"9 개 배열의 배열의 첫 번째 요소에 대한 포인터로 해석 될 수
bool sodoku::theRow(test arr[][9][9], int testNumber, int row)
...
boot sudoku::theRow(test arr[][9], int testNumber, int row)
{ ... }
test array[9][9];
sudoku::theRow(array, 0, 0);
그리고 그 방법으로도 정의 할 수 있습니다 : 당신은 아마 수행 할 작업을 실제로
, 그래서, "테스트"9 개 배열의 전달 배열입니다
boot sudoku::theRow(test (*arr)[9], int testNumber, int row)
{ ... }
많은 정보가 C/C++의 매우 혼란스러운 배열/포인터 혼합에 관한 인터넷 상에 존재합니다. 예를 들면 : http://pw1.netcom.com/~tjensen/ptr/pointers.htm
아, 고마워. 배열은 기본적으로 참조로 전달됩니다. 그냥 궁금해서. – user1567909
원래 이유를 모르지만 C 언어에서 상속 된 것 같습니다. 기본적으로 값으로 전달하는 것은 필요한 메모리로 인해 좋은 생각처럼 들리지 않습니다. –
'void f (int a [9] [9])'가 아닌'void f (int (* a) [9])'(9 int 배열에 대한 포인터/배열) (int에 대한 포인터/배열) –