2016-12-07 5 views
0

무효 theFunc (INT 인분 &는 INT에서 * 어레이) 기준 및 배열 포인터에 의해 나타내는 int 취하는배열을 참조하여 스택 할당 인자를 전달 I 함수가

theFunc(int num&, int* array) 
{ array[0] = num; 
} 

이 말한다 단지 일례 함수는 단순한 작업을 수행하므로

int main() 
{ int k = 3; 
    int* theArray = new int[5]; 
    theFunc(k, theArray); 

delete[] theArray; 
return(0); 
} 

질문은 K, 스택 할당 INT 인스턴스 theFunc 참조로 전달 동적 저장 배열에 저장하는 방법이다. 스택/힙 사이에는 특정 저장된 메모리 주소가 있기 때문에 객체/인수가 이동할 수 없다는 것을 알고 있습니다. 나는 이것이 왜 작동하는지 이해하고 싶다. 그리고 두포에서 무슨 일이 일어나고 있는지 (이 경우에는 값을 매기는 것과 차이가있다)도 알고 싶다.

감사합니다.

+2

스택 변수에는 메모리 주소도 있습니다. 주소는 힙 주소와 같은 방식으로 함수에 전달됩니다. –

+0

또 다른 요점은'k'의 _value_가'array [0]'에 _copied_가되었습니다. – qxz

+0

'int num &'은 구문 오류입니다. 또한'theFunc'에는 리턴 타입이 있어야합니다. 실제 코드를 게시하십시오. –

답변

1

짧은 대답은 k이 동적으로 할당 된 배열에 저장되지 않는다는 것입니다. 오히려, int *theArray = new int[5]을 쓸 때 5 개의 정수 배열을 저장할 수있는 메모리 블록을 할당합니다. 실제로 그것은 이미 입니다.은 5 개의 정수를 유지합니다. 다른 작업을 수행하지 않은 경우 theArray[0]은 유효한 표현식입니다. 즉, 해당 값은 -32,768 또는 그와 비슷한 값이 될 수 있지만 정수입니다. k을 참조하여 theFunc을 호출하면 theArray[0] 값이 복사 할당으로 k으로 변경되므로 k 값을 배열의 첫 번째 요소에 할당 할 수 있습니다. 새로운 것을 저장하지 않고, 이미 저장된 값을 변경하는 것입니다.

사실,이 특별한 경우에 참조로 num을 전달하면 아무 것도 얻거나 잃지 않습니다. 작성된 함수의 관찰 가능한 동작은 값으로 전달 된 경우 동일합니다.

0

변수 K는 스택에 있습니다. 이것은 프로그램이 사용하는 메모리 덩어리입니다. 따라서 모든 스택 항목은 여전히 ​​주소 지정 가능한 메모리 위치로 존재합니다.

theFunc를 호출하면 K의 해당 주소가 호출 스택에 푸시되고 theFunc에서 튀어 나옵니다. 배열 위치에 할당 할 때 전달 된 주소의 값인 num (또는 K) 값이 배열에 복사됩니다.

이 경우에는 theFunc가 num (또는 K)을 변경하지 않으므로 값 전달은 동일한 효과를 갖습니다.