先看代碼
#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;
}