존 (Jon)이 필요한 답변을 주셨지만 알고 있어야 할 몇 가지 세부 사항이 있습니다.
배열의 C 처리는 search
함수가 int
의 3x3 배열을받지 못하도록합니다. 대신 포인터를 3 요소 배열 int
으로 수신합니다. C 언어에서 표준 초안 n1256 :
6.3.2.1 Lvalues, 배열 및 기능 부호
...가
sizeof
운영자 또는 단항
&
연산자의 오퍼랜드 인 경우를 제외
3 또는 배열을 초기화하는 데 사용되는 문자열 리터럴 인 경우 형식이 ''유형의 배열 ''인 식은 배열 개체의 초기 요소를 가리키는 유형 ''포인터 ''유형의 식으로 변환됩니다. lvalue. 배열 객체에 레지스터 저장 클래스가 있으면 비헤이비어가 정의되지 않습니다. 만약
result = search(Array, number);
를 호출 할 때
따라서, 식 Array
유형은 암시 int
의 3 소자 어레이 (int (*)[3]
포인터에 int
(int [3][3]
)의 3 소자 어레이의 3 소자 어레이로부터 변환되고). 함수 매개 변수 선언 문맥에서 T a[]
및 T a[n]
은 T *a
과 동의어입니다. 함수 프로토 타입을
int search(int (*a)[3], int x)
으로 변경할 수 있으며 완전히 동일하게 동작합니다.
결과적으로 search
은 3x3 어레이뿐만 아니라 모든 Nx3 어레이에서도 작동 할 수 있습니다.a
이 항상 3x3이라고 가정하는 함수를 작성했습니다. 당신이 행의 다른 숫자의 배열을 처리 할 수 있도록하려면, 당신은 배열의 행 수를 지정하는 별도의 매개 변수를 전달해야합니다 :
int search(int (*a)[3], size_t rows, int x)
{
size_t i, j;
for (i = 0; i < rows; i++)
for (j = 0; j < 3; j++)
if (a[i][j] == x)
return 1;
return 0;
}
int main(void)
{
int fiveRowArray[5][3] = {{ 1, 2, 3}, { 4, 5, 6}, { 7, 8, 9},
{10,11,12}, {13,14,15}};
int twoRowArray[2][3] = {{ 1, 2, 3}, { 4, 5, 6}};
int number;
printf("Gimme a number: ");
fflush(stdout);
scanf("%d", &number);
if (search(array, sizeof fiveRowArray/sizeof *fiveRowArray, number))
printf("Number exists in fiveRowArray\n");
else
printf("Number does not exist in fiveRowArray\n");
if (search(array, sizeof twoRowArray/sizeof *twoRowArray , number))
printf("Number exists in twoRowArray \n");
else
printf("Number does not exist in twoRowArray \n");
return 0;
}
sizeof arr/sizeof *arr
표현의 요소의 수를 계산 배열의 총 배열 크기를 바이트 (sizeof arr
)로 가져 와서이를 개별 배열 요소 (sizeof *arr
또는 sizeof arr[0]
)의 바이트 수로 나눠서 배열을 만듭니다. 이것은 배열 타입의 표현식에 대해서만 작동합니다; 배열로 처리되는 포인터 (예 : search
함수의 a
)에는 작동하지 않습니다. 당신이 행 및 열의 다른 숫자를 처리하는 경우
, 다른 접근 방식 걸릴해야합니다 :이 경우
int search(int *a, size_t rows, size_t cols, int x)
{
size_t i, j;
for (i = 0; i < rows; i++)
for (j = 0; j < cols; j++)
if (a[i * cols + j] == x)
return 1;
return 0;
}
int main(void)
{
int fiveByThree[5][3] = {...};
int twoByFour[2][4] = {...};
...
if (search(&fiveByThree[0][0],
sizeof fiveByThree/sizeof *fiveByThree,
sizeof fiveByThree[0]/sizeof *fiveByThree[0],
number))
...
if (search(&twoByFour[0][0],
sizeof twoByFour/sizeof *twoByFour,
sizeof twoByFour[0]/sizeof *twoByFour[0],
number))
...
}
을, 우리는 명시 적으로 각각의 첫 번째 요소에 대한 포인터를 전달 배열을 가리키는 대신 int
의 배열에 대한 포인터를받는 대신 search
은 int
에 대한 간단한 포인터를받습니다.이 포인터는 1D 배열로 처리되며 오프셋은 수동으로 i * cols + j
으로 계산됩니다. 이 코드에서는 2D 배열의 모든 요소가 연속되어 있다고 가정합니다. C99에서, 당신은 배열 차원이 아니라 상수 표현식보다 런타임 변수로 지정할 수있는 가변 길이 배열 (블라스를) 호출 무엇을 가질 수
는
편집
참고; 이것은 우리가 프로토 타입을 쓸 수있게 해줍니다.
int search(size_t rows, size_t cols, int arr[rows][cols], int x)
그리고 포인터가 엉망이 아닙니다.
시도해 보셨습니까? – aschepler
말하기 어렵습니다. 오류 및 경고없이 컴파일 되었습니까? 사용한 테스트 데이터로 작동하는 것으로 보입니까? – paxdiablo
예. 출력이 올바르지 않습니다. – BinaryLife