2 回答

TA貢獻(xiàn)1875條經(jīng)驗(yàn) 獲得超3個(gè)贊
1.聲明字符數(shù)組時(shí),[]中的數(shù)應(yīng)為數(shù)組中字符個(gè)數(shù),包括'/0'
如 char p[5] = "dddd";
則實(shí)際為:'d' 'd' 'd' 'd' '/0'.
若 char p[5] = "ddddd";
則編譯出錯(cuò),提示越界.
2.(1)初始化字符數(shù)組時(shí),會(huì)自動(dòng)補(bǔ)充'/0'
如 char p[5] = "dd";
則實(shí)際為:'d' 'd' '/0' '/0' '/0'
再如 char p[3] = "";
則實(shí)際為:'/0' '/0' '/0'
(2)若沒有只是聲明字符數(shù)組,沒初始化并不會(huì)自動(dòng)補(bǔ)'/0'
如 char p[3];
則實(shí)際字符數(shù)組內(nèi)容并不可知,因?yàn)閷?shí)際上p也是個(gè)指針,現(xiàn)在并不知道它的指向
(3)同理,聲明字符指針并不初始化時(shí),也不知道指針的指向
如 char *p;
(4)聲明并初始化指針,由于"內(nèi)存對齊"(由編譯器實(shí)現(xiàn)),對32位機(jī)
則會(huì)補(bǔ)齊4位,自動(dòng)補(bǔ)'/0'
如 char *p = "a";
則實(shí)際為:p[0]='a',p[1]='/0',p[2]='/0',p[3]='/0'.
若 char *p ="";
則實(shí)際為:p[0]='/0',p[1]='/0',p[2]='/0',p[3]='/0'.
include <iostream>
using namespace std;
/*
void fun(char (&buff)[11])//括號(hào)里必須有11才不報(bào)錯(cuò)
{
cout<< buff;
}
*/
template<size_t size>
void fun(char (&buff)[size])
{
cout<< buff;
}
int main(int argc, char *argv[])
{
char buff[] = "helloworld";
fun(buff);
return 0;
}
/*
void fun(char (&buff)[11])跟void fun(char *&buff);完全是兩回事,
c++的數(shù)組類型是帶有長度信息的,引用傳遞時(shí)如果指明是數(shù)組則必須指定長度,char[]這種是不完全類型,在沒有別的條件來確定長度的情況下是不能當(dāng)做一個(gè)類型來使用的
如果lz想接收任意長度的數(shù)組,應(yīng)當(dāng)使用模板函數(shù)
template<size_t size>
void fun(char (&buff)[size])
{
cout<< buff;
}
*/

TA貢獻(xiàn)1836條經(jīng)驗(yàn) 獲得超4個(gè)贊
如果你的數(shù)組是定長的,比如都是char [10]那么可以把每個(gè)數(shù)組定義為char a[10], b[10]...
函數(shù)定義為void func(char s[10]) 然后調(diào)用就可以
也可以直接傳char *,然后在程序中按照s[10]操作
如果不定長 可以傳指針和size過去
void func(char *s, int len)
你說的報(bào)錯(cuò) 能說下你是怎么定義和調(diào)用的嗎?
添加回答
舉報(bào)