C++字符数组的定义和传参
我觉得定义字符数组是⼀件很⽞学的事
(整型数组可以由此类推,这⾥就不单独讲解了)
虽然说⽹上有许多blog讲解,但是这⾥我还是想要做⼀个尽量全⾯的总结
我们在处理字符串的时候,最常⽤的两种数据类型就是和众所周知,实际上就可以笼统的认为是⼀个⼀维char数组
string s ="Hello world!";
那么我们怎么定义⼀个char 类型的⼀维数组存储⼀个字符串呢?
下⾯我给出了三种⽅法:
char c [10]; //1
char *c1; //2
char c2[]; //3
⽅法⼀是中规中矩的定义了⼀个长度为10的⼀维数组(⽐较憨)
⽅法⼆本质上是定义了⼀个指针,因为数组名称实际上就是数组的起始地址
⽅法三定义了⼀个长度不定的字符串数组
⽽⽅法⼆和⽅法三,在实际应⽤中,⼀般都会在定义的时候提供对于c1,c2的初始化,根据初始值确定字符数组的⼤⼩char *c1="like";
char c2[]="love":
如此定义,计算机会在字符串后⾃动添加结束符 ’ \0 ’ ,然后赋值给变量
那么⽅法⼆和⽅法三有什么区别嘛?
实际上是有的:
char *c ="live";
c [1]='o';
//Wrong!Wrong!Wrong!
char c1[]="love";
c1[1]='i';
//Yes!Yes!Yes!
注意:指针式定义法⽆法⽤⼀般⽅法改变某个字符
指针式定义在编译时,会直接标记为const (指向常量字符串的指针)
下⾯我们就要⾯对⼆维字符数组的定义了
还是由浅⼊深,从说起:
string s0[2]={"Hello","world"}; //憨憨定义,没意思
string s []={"Hello","world"};
char string
string string
那么string类型的⼆维数组可以⽤指针定义嘛?
很遗憾,不可以:
下⾯就看⼀下⽐较复杂的char类型⼆维数组:
(我们将定义和初始化结合在⼀起讨论)
//1
char*c[2]={"aa","bb"};
//2
char*c[]={"aaa","bbb","ccc"};
//3
char c[][3]={"aa","bb"};
//4
char c[2][3]={"aa","bb"};
//5
char c[2][3]={{'a','a'},{'b','b'}};
//6
char c[2][3]={{'a','a','\0'},{'b','b','\0'}};
我在这⾥尝试对这些定义做出⼀些解释:
⽅法⼀:
定义⼀个⾏数为2,列数不确定的数组
⽅法⼆:
定义⼀个⾏数,列数均不确定的数组
⽅法三:
定义⼀个⾏数不确定,列数为3的数组
双中括号的定义⽅式,只能省略⾏数的定义
注意这⾥列数为3⽽不能再少了,是因为字符串结束符 ’ \0 ’ 必须占据⼀位⽅法四:
精准定义⼆维数组⼤⼩,直接⽤字符串进⾏初始化
⽅法五:
精准定义⼆维数组⼤⼩,⽤单个字符串进⾏初始化,不添加末尾结束符
⽅法六:
精准定义⼆维数组⼤⼩,⽤单个字符串进⾏初始化,添加末尾结束符
如果我们想要在函数调⽤时,传递数组怎么办?
⼀维char类型数组的传递⾮常简单
以下的每种⽅法传递的都是引⽤,可以在函数中对数组进⾏修改
不过如果⼀开始定义的时候使⽤了指针式定义法,是不能单独修改字符串某位的
char c []="live";
//这⾥如果⽤*c 形式定义是不能进⾏修改的
void doit (char *c ) {
c [1]='o';
cout <<c <<endl ;
return ;
}
输出:love
下⾯的两种⽅法也是可以成功进⾏上述操作的:
char c []="live";
void doit (char c []) {...}
void doit (char c [10]) {...}
重点看⼆维字符数组:
类型:传递引⽤
因为string类型定义的时候是不能使⽤指针形式的,所以以下两种传参⽅式都可以对字符数组进⾏ “ 本质修改 ”string s []={"aaa","bbb"};
void doit (string *s ) { //这⾥可以是指针类型
s [0][0]='z';
for (int i =0;i <2;i ++) cout <<s [i ]<<endl ;
return ;
}
输出:
zaa
bbb
//以下同理
void doit (string s []) {...}
类型:
⾸先让我再次强调⼀遍:如果使⽤指针式定义,不能单独修改某⼀位
下⾯我要简单解释⼀下这些传递⽅式:
//1
char c [][4]={"aaa","bbb","ccc"};
void doit (char **c ) {
/
/c[0][0]='z'; 不合法
for (int i =0;i <2;i ++)
cout <<c [i ]<<endl ;wrong是什么意思
return ;
}
⽅法⼀的传递⽅式,是完全不能⽀持修改的
//2
char c [][4]={"aaa","bbb","ccc"};
void doit (char *c []) {
//c[0][0]='z'; 不合法
...
}
string char
很遗憾,⽅法⼆的传递⽅式,也不能⽀持修改
//3
char*c[4]={"aaa","bbb","ccc","ddd"};//注意这⾥的定义形式
void doit(char*c[4]){
//c[0][0]='z'; 不合法
...
}
想要使⽤⽅法三提出的传递⽅式,在定义的时候就需要保持⼀致
不⽀持修改 /我裂裂裂裂裂开
/
/4
char c[][4]={"aaa","bbb","ccc"};
void doit(char c[][4]){
for(int i=0;i<3;i++)
cout<<c[i]<<endl;
c[0][0]='z';
cout<<c[0]<<endl;
return;
}
输出:
aaa
bbb
ccc
zaa
⽀持修改的好榜样
//5
char c[2][4]={"aaa","bbb"};
void doit(char c[2][4]){
for(int i=0;i<2;i++)
cout<<c[i]<<endl;
c[0][0]='z';
cout<<c[0]<<endl;
return;
}
输出:
aaa
bbb
zaa
定义数组的时候需要确定⼤⼩,同样⽀持修改
写在最后:
可能是有点着急了,所以代码给的都不是很完整,这对于基础薄弱的宝贝们可能⾮常不友好
某位憨憨反映看不太懂(/撅嘴),所以我就添加了⼀些代码细节和注释,希望可以帮到⼤家吧~欢迎⼤家提出建议咯~~
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论