2013-06-29 4 views
0

문제가 있습니다. 함수가 있고 특정 것을 이해하지 못합니다. 함수는 다음과 같습니다.배열이있는 포인터 함수

int F(int* x , int n){ 
    int i , m=0 
    for (i=0;i<n; i++){ 
     m=x[ i ] + m; 
    } 
    return m * m ; 
} 

나는 함수를 포인터와 정수로 호출합니다. 나중에 "for"을 수행하지만 행을 이해하지 못합니다.

m=x[ i ] + m; 

x는 포인터가 아니기 때문에 배열입니다.

도와주세요.

그러면 x는 메모리 위치를 가리키고 +1합니다. 예를 들어 함수를

으로 호출하면
n=10 
x=&n 
F(x,n) 

이 함수는 이상한 음소를 반환합니다.

X는 위치 메모리를 n으로 가리키고, 나중에 위치 메모리를 n + 1로 가리 킵니다.

+2

배열 색인은 포인터 유형에도 적용됩니다. 배열과 포인터는 더 많이 또는 덜 호환됩니다. –

+2

** x [i] **는 ** \ * (x + i) ** –

+0

과 같습니다. 메모리 위치가 +1됩니다. 예를 들어, n = 10, x = & n; F (x, n), 함수는 이상한 것을 반환합니다 –

답변

0

배열은 인접한 메모리로 표시되며 배열 변수는 해당 메모리의베이스에 대한 포인터 (예 : &(x[0]))로 해석됩니다. 배열 오프셋 구문은 포인터 연산으로 변환됩니다. 역 참조 인덱스 A [B]에 상당 * (a + b) -

은 [] :

difference between pointer and arrays을 명확히 소식을 참조. 즉, a와 b는 배열 요소와 정수에 대한 포인터 여야합니다. a [b] == * (a + b) == * (b + a) == b [a]이기 때문에 각각 반드시 필요하지는 않습니다. 또 다른 중요한 동등 함은 p [0] == 0 [p] == * p입니다.

기능은 동등 (아마도 더 선명하게) 선언 될 수 있습니다

int F(int x[], int n); 

그리고 당신과 같이 그것을 부를 것이다 :

int data[3] = {1, 2, 3}; 
int value = F(data, 3); 
+0

그러면 n은 배열이어야합니다? x가 x [0] 인 포인터가 n이고 나중에 * (n + 1)을 가리 키기 때문에 그 위치에 가비지가 있습니까? –

+0

예, 업데이트 된 질문에 표시된 방식대로 "쓰레기"입니다. 말 그대로 배열 (배열로 취급 될 수있는 인접한 메모리 블록)이 아닌 단일 정수에 대한 포인터를 전달하고 있습니다. 'F'는'int'를 저장하는 메모리 블럭의 포인터가 될'x'를 의도하고 그 배열의 길이는'n'을 의미합니다. –

+0

함수 호출에 대한 예를 들어 주시겠습니까? –

0

를 x는 포인터이기 때문에, 당신이 통과 할 때 함수에 대한 배열, x는 배열의 첫 번째 요소를 가리 킵니다. 배열은 연속적인 메모리 할당이므로 포인터는 배열의 연속 요소를 가리 키도록 만들 수 있습니다.

m=x[i]+m 

X [I]가 10으로 배열

main() 
{ 
    int x[10]={1,2,3,4,5,6,7,8,9,10},sum; 
    sum=function(x,10); 
    return 0; 
} 

이 함수는 함수의 어레이를 전송의 첫 번째 요소에서 인덱스 번째 i에 내포 이유 한게 어레이의 크기

+0

함수를 호출하는 예제를 제공해 주시겠습니까 –

+0

@SergioOvalle : edited –