(20)下列语句中,正确的是(A)。
A)char*myString="Hello-World!";
B)char myString="Hello-World!";
C)char myString[11]="Hello-World!";
D)char myString[12]="Hello-World!";
【答案】A
定义Char字符型变量时,不能直接把字符串"Hello-World!"赋值给myString,所以B是错误的。
关于C和D,编译会报错error C2117: 'Hello-World!' : array bounds overflow数组溢出,若下标改为13或者以上则为对,即可以写为char myString[13]="Hello-World!";也可以写为:char myString[] = "Hello-World!";
char *myString = "Hello-World!";和 char myString[] = "Hello-World!";两者之间有什么差别?
两者没有什么很大的区别 ,除了 sizeof(myString)两者返回的值不同,
char *myString = "Hello-World!";是定义了一个指向字符串"Hello-World!"的首地址的指针。
"Hello-World!"作为静态字符串实际上存储在数据区,但写程序的人不知道这个地址,而程序本身知道。
char myString[13]="Hello-World!";是定义了一个字符型数组。
当某一函数以char myString[] = "Hello-World!";方式使用此静态字符串时,实际上相当于:
char myString;
strcpy(myString, "Hello-World!");
myString[13]是在栈里临时分配的。虽然myString指向的内容是"Hello-World!"但是这是复制品,不是原件。当函数结束,charmyString[]就被程序回收了,所以myString[]的内容就不再是"Hello-World!"了。
但如果以char *myString="Hello-World!";的方式使用,myString指向的是静态字符串存储的位置,也就是说指向"Hello-World!";的原件。
如果想坚持用char myString[]而不使用char *myString, 能保证str为"Hello-World!"有效方法必须是:
{
static char myString[]="Hello-World!";
return myString;
}
static char []是静态的,存储在数据区。
应用举例,如何将两个char*类型字符串连接?
#include <iostream>
using namespace std;
int main()
{
char str3[20];
char* str1="Hello ";
char* str2="World!";
strcpy(str3,str1);
strcat(str3,str2);
char* str=str3;
cout<<str1<<endl;
cout<<str2<<endl;
cout<<str<<endl;
return 0;
}
测试结果:
题外话:char型变量中能不能存储一个中文汉字,为什么?
在C/C++ 里面不能用char型变量存储中文汉字,因为char 只占一个字节, 汉字为两个字节。
C++中char类型只能保存单个字符。如:char s = 's'; char i = '1';
而汉字通常是两个字节来表示,不过我们可以使用char数组来表示汉字。例如char a[5]="你";
不过,在C#和java里面char为两个字节,因为C#char型变量是用来存储Unicode编码的字符的,unicode编码字符集中包含了汉字,所以,char型变量中可以存储一个汉字。