C++ 这个C++;代码工作

C++ 这个C++;代码工作,c++,pointers,C++,Pointers,我正在处理一个现有的项目(由其他人编写),我无法理解这两个简单的函数 我感兴趣的第一个函数包含以下内容: int iCounts[NUM_GRADES]; PROFILEMAN->GetMachineProfile()->GetGrades( pSong, GAMESTATE->GetCurrentStyle()->m_StepsType, iCounts ); 所以我可以看到iCounts被传递到GetGrades,这很好。但后来,iCounts的用法是这样的: Ap

我正在处理一个现有的项目(由其他人编写),我无法理解这两个简单的函数

我感兴趣的第一个函数包含以下内容:

int iCounts[NUM_GRADES];
PROFILEMAN->GetMachineProfile()->GetGrades( pSong, GAMESTATE->GetCurrentStyle()->m_StepsType, iCounts );
所以我可以看到iCounts被传递到GetGrades,这很好。但后来,iCounts的用法是这样的:

AppendOctal( iCounts[g], 3, foo );
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时,它看起来是这样的:

AppendOctal( iCounts[g], 3, foo );
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中没有指针时,如何修改原始函数的ICount?

数组会退化为指针;当你将一个元素传递给一个函数时,你传递的不是整个数组的副本,而是指向数组的指针。

这不是更像是向数组(实际上是第一个元素)传递指针吗
传递数组本身
听起来很混乱/可能被误解。我也不喜欢这个公式,因为它在传递int[]时暗示int*[]。我更喜欢指定它们具有指针语义(与值语义相反),这可以为我明确地解释它。这种行为背后的原因是什么?我不知道,它是如何在C语言中设计的。我并不特别喜欢这种行为,它让很多人感到困惑。在C++中,我倾向于避免它们,并坚持STD::vector和STD::SARDATION。@ CameronBall在C中是一个方便的地方,在这里把数组作为指针或(指针,大小)对是非常普遍的。C++希望在很大程度上与C兼容,因此数组语义非常糟糕。在C++中,你总是想要使用<代码> STD::vector < /COD>或<代码> STD::数组< /C> >而不是<代码> t[n] < /Cord>。