ポインタと参照渡し。

http://builder.japan.zdnet.com/sp/c-programming-language/story/0,3800083430,20370255,00.htm

これはC++のほうがやりやすいと思う。mfcオレオレで書く
http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/wcemfc/htm/cstring_8.asp

元ソース
構造体全コピーかかるため遅い
hoge内でやりたいほうだい書き換えなどやってもmain内のsには影響無し

void main(void)
{
    CString s("abcdef");
    hoge(&s);
}

void hoge(CString str)
{
    ASSERT(str.Find('c') == 2);
}

ポインタにしてアドレス渡すだけにする
アドレス渡すだけなので速い
main内のsに影響
メンバ参照の書き換え等の作業が必要、呼び出しもとをアドレス渡しと明示しないとだめ

void main(void)
{
    CString s("abcdef");
    hoge(&s);
}

void hoge(CString *str)
{
    ASSERT(str->Find('c') == 2);
}

参照で渡す
アドレス渡すだけなので速い
main内のsに影響
元ソースそのまま使える

void main(void)
{
    CString s("abcdef");
    hoge(s);
}

void hoge(CString &str)
{
    ASSERT(str.Find('c') == 2);
}

わざわざ、normalなCせんでも、Javaな人ならclassで説明すれば良かったのに...
って

C言語では呼び出し元の変数を変更する「参照呼出し」という機能がない

っ('A`)... C++で書けばよかったのに...乙('A`)