2013-07-25 5 views
2

나는 (다른 누군가가 작성한) 기존 프로젝트에서 작업하고 있는데,이 두 가지 간단한 함수를 사용하여 머리를 쓸 수 없습니다. 나는에 관심이이 C++ 코드는 어떻게 작동합니까?

첫 번째 기능이 포함되어 있습니다

int iCounts[NUM_GRADES]; 
PROFILEMAN->GetMachineProfile()->GetGrades(pSong, GAMESTATE->GetCurrentStyle()->m_StepsType, iCounts); 

그래서 나는 iCounts이 잘되는, GetGrades에 전달되는 것을 볼 수 있습니다. 하지만 나중에 iCounts는 다음과 같이 사용됩니다.

AppendOctal(iCounts[g], 3, foo); 

그래서 iCount가 변경되었습니다. 내가 GetGrades에서보기를 갈 때, 그것은 다음과 같습니다

void Profile::GetGrades(const Song* pSong, StepsType st, int iCounts[NUM_GRADES]) const{ 
    SongID songID; 
    songID.FromSong(pSong); 

    memset(iCounts, 0, sizeof(int)*NUM_GRADES); 

    ...then some more stuff is done to iCounts 

} 

GetGrades에 참여하는 포인터가 없을 때, 어떻게 원래의 함수의 iCounts은 내가 이해할 수없는 무엇을 수정됩니까입니까?

답변

8

포인터가 붕괴됩니다. 하나를 함수에 전달할 때 전체 배열의 복사본을 전달하지 않고 배열에 대한 포인터를 전달합니다.

+0

더 이상 포인터 (실제로 첫 번째 요소)를 전달하지 않는 것입니까? '그 배열 자체를 전달하는 것'은 혼란스럽고/나에게 잘못 해석 될 가능성이 있습니다. – ted

+0

int를 전달할 때 int * []를 의미하기 때문에이 공식을 좋아하지 않습니다. []. 나는 그것들이 포인터 의미론 (value semantics와 반대로)을 가지고 있다고 명시하는 것을 선호한다. – Borgleader

+0

확실히 나를 위해 그것을 설명한다. 이 행동의 근거는 무엇입니까? –

관련 문제