2013-04-08 2 views
0

왜 내 코드가 작동하지 않습니까?포인터를 사용하여 배열을 탐색하는 방법은 무엇입니까?

#include <stdio.h> 

int main() 
{ 
    int test[] = { 3, 9, 7 }; 
    printf("%d", find(test, 3)); 
    return 0; 
} 

int find (int array[], int size) 
{ 
    int i, largest, where; 
    largest = array [0]; 
    for (i=0; i<size; ++i) { 
     if (array[i]>largest) { 
      largest = array[i]; 
      where = i; 
     } 
    } 
    return (int) *(&array+sizeof(int)*where); 
} 

은 내가 대체 할 수 알고 :

return array[where]; 

하지만이 운동의 요점되지 않습니다 :

return (int) *(&array+sizeof(int)*where); 

와 함께.

답변

2

포인터 계산이 작동하지 않는다고 생각합니다.

return *(array + where); 

array 이미 포인터이며, 추가 할 때 포인터 연산은 "올바른 일을"당신이 찾고 있습니다.

기능 서명에 int array[]이 있으니 혼란 스러울 것입니다. int *array의 합성 설탕 일뿐입니다. 배열이 아니라 포인터가 있습니다.

다른 답변에서 잘못된 정보가 날아오고 있으므로 여기에서 더 자세한 설명을 작성하려고합니다. 이 함수 서명 :

int find(int array[], int size) 

정말 의미 : 위에서 언급 한 바와 같이

int find(int *array, int size) 

[]의 사용은 단지 문법 설탕입니다.

find(test, 3); 

test

는 첫 번째 요소에 대한 포인터로 자동으로 부패한다 : 당신은 같은 함수를 호출 할 때. 그것은 당신이 호출 한 경우와 동일입니다 : 이제

find(&test[0], 3); 

, 수익 문을보고, 당신이 볼 수 있습니다 :

return (int) *(&array+sizeof(int)*where); 

이 이해가되지 않습니다 - 먼저 &array의 매개 변수의 주소입니다 -이 경우에는 포인터 매개 변수이지만 실제로는 중요하지 않습니다. 그것에 추가하고 역 참조를하면 원하는 배열에서가 아니라 스택에서 임의의 데이터를 반환 할 것입니다.

두 번째로, sizeof(int)의 곱셈은 불필요합니다. C의 포인터 산술에는 이미 뾰족하게 이어지는 형식의 크기에 의한 암시 적 곱셈이 포함됩니다. 당신이 정말 반환하려는 것은 :

return *(array + where); 
+0

그래서 배열은 기본적으로 & array [0]입니까? 왜 당신은 단지 어디에 추가합니까? sizeof (int) *를 어디에 추가해야하지 않습니까? – user2258753

+0

신경 쓰지 마십시오. 마이크는 설명했다. – user2258753

+0

@ user2258753,'sizeof (int)'는 불필요합니다 - 포인터 산술은 이미 뾰족한 유형의 크기에 의한 암시적인 곱셈을 포함합니다. 'array'는 배열이 아니고 포인터이기 때문에'array'는 * NOT *'& array [0]'입니다. * * 배열 인 경우 대부분의 경우 배열의 이름이 첫 번째 요소에 대한 포인터로 감소합니다. –

0

당신이해야 할 :에 해당

return array[where]; 

where 이후

return *(array+where); 

을하여 array 오프셋된다.

return *(array + where); 

사실은 당신의 주요 기능에 당신이 가지고있다 : 당신은 더 이상 당신은 크게이과 복잡함을하고

2

이 ...

return array[where]; // this means, take the base memory location of "array" then 
         // add in an offset of where and dereference the result 

으로 동일하다는 sizeof(int) 필요하지 않습니다 test이라는 배열을 find() 함수 the array will decay to a pointer에 전달하면됩니다. 그래서 당신은 지금 당신이 포인터를 가지고 있음을 알고 있다면 당신은 왜이 같은 주소를 잡을 수 없습니다 갈까요 표시되어야합니다

&array 

그리고에 의해 주어진 있기 때문에 당신은, 오프셋 (offset) "를 sizeof"을 추가 할 필요가 없습니다 포인터의 유형 (int *)

+0

나는 그가 배열을 가지고 있다고 생각하기 때문에 OP가 혼란 스럽다고 생각한다. 배열의 모든 요소가 배열의 첫 번째 요소에 대한 포인터 일 때. –

+0

Re : 편집 :'& array'는 실제로이 경우 완전히 틀린 *입니다. 왜냐하면'array'는 함수의 포인터 매개 변수이기 때문에 * 배열이 아닙니다. –

+0

@Carl - 네, 이유를 설명하는 더 좋은 방법을 생각하려고했습니다. 왜 잘못 되었습니까? 네, "불필요한"이라고 말하는 것은 잘못되었습니다. – Mike

관련 문제