如何理解和使用char(&)[]

先看代碼

#include <iostream>
static const int A_NUM_FOR_TEST = 2048;
void testfunc(char(&data)[A_NUM_FOR_TEST])
{
    if (data==nullptr)
    {
        return;
    }
    char* ch = data;
    for (int i = 0; i < A_NUM_FOR_TEST; i++)
    {
        std::cout << data[i] << "\t";
    }
}
int main()
{
    char data[A_NUM_FOR_TEST] = { 0 };
    testfunc(data);

    const char* data1 = "hello world";
    //testfunc(data1);//報錯

    char data2[A_NUM_FOR_TEST-1] = { 0 };
    //testfunc(data2)
    return 0;
}

代碼中定義函數(shù)testfunc的參數(shù)類型為char(&name)[size],其中size為常量值;
這里可以理解data形參為:某固定長char數(shù)組的引用類型。
在我們傳參時,也要傳對應(yīng)類型的定長大小數(shù)組,否則會報類型不匹配錯誤。

使用

使用參數(shù)name的時候,可以像操作char指針一樣操作,因為char[]本質(zhì)上就是char
1.在C++中原生數(shù)組傳遞的是該類型的指針,當(dāng)我們傳遞數(shù)組的時候正常是要把數(shù)組首元素地址和數(shù)組大小,一同傳遞;但是如果使用定長素組引用這種傳遞定長數(shù)組引用的方法,就不用傳遞兩個參數(shù)了。
2.但是除了char類型數(shù)組,其他類型的原生數(shù)組,這樣寫就完全沒必要了,直接傳遞std::vector<T>&||std::array<T>引用就好了。
3.實際使用場景,可以用作網(wǎng)絡(luò)協(xié)議字段,傳遞使用,一般我們定義網(wǎng)絡(luò)協(xié)議都會定義固定大小char[32]的字節(jié)數(shù)組方便序列化和反序列化(分配在棧區(qū))。
4.因為C語言中是沒有引用的概念,所以這種寫法是不兼容C代碼的。

使用demo

#include <iostream>
typedef char GameName[32];
void Handler(GameName& data)
{
    if (data==nullptr)
    {
        return;
    }
    std::cout << data << std::endl;
}
int main()
{
    GameName name = "hello world";
    Handler(name);

    char name2[64] = "no happy";
    //Handler(name2); //長度不匹配
    return 0;
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容