#include<iostream>
using namespace std;
int main()
{
char a[20]="hello";
}
是正确的。
#include<iostream>
using namespace std;
int main()
{
char a[20];
a[20]="hello";
}
确实是错误的。以上的a[20]就等价于调用数组a的第21个元素,故该语句的意思就是,想把字符串“hello”存在一个字符单位a[20]里,很显然是错误的,第一,无a[20];第二,“hello”字符串长度为6,根本不能存在一个长度单位里面。
2、数组的字母代表首地址,定义一个数组之后,该首地址就已经固定了。
Class fun
{
private:
char pa[20];
public:
fun(char *p)
{
pa=p;
}
}
这个类很显然出现了一些问题,因为该类的构造方法试图去改变数组的首地址,很显然是不可能的。
3、使用字符指针和字符数组存储字符串的形式完全不一样
#include<iostream>
using namespace std;
int main()
{
char a[200]="hello";
char *p="dsfsdfsdfsds";
int m=sizeof(a);
int n=sizeof(p);
cout<<m<<endl<<n<<endl;
cout<<a<<endl<<p<<endl;
}
200
4
hello
dsfsdfsdfsds
可见字符指针和字符数组所占的空间是不一样的,数组大小与数组元素个数有关,指针所占内存大小与内存的地址空间有关,此编译器结果为4,说明占了32位,也就是说该编译器认为本机的内存为2^32B,即4G。
sizeof求得是该变量所占的内存的大小,而strlen求的是改变量的长度,要想求出字符指针所指字符串的长度,可以用strlen,遇到字符串中的‘\0’才结束。对于字符数组,其对应的strlen和sizeof的大小是相等的。
但对于asII码的sizeof("IT学吧");和strlen("IT学吧");,显然前者是7(即所占的内存),后者是6(即长度,遇‘\0’结束)。但对于Unicode码的sizeof("IT学吧");和wcslen("IT学吧");前者为10(每个字符均占两个字节),后者是4(两个字节为一个长度,遇到"\0\0"结束)
4、数组名作为函数参数进行传递,传递的是地址,因此必会改变数组的值。具体可参见http://blog.csdn.net/lz465350/article/details/19161537
5、要想使用string s;定义一个string对象,就必须使用#include<string>,而不能用#include<cstring>。cstring中没有string类,只有strcpy、strcmp等函数。如果用cin输入字符串,最好用string s;可以直接cin>>s;。cin的输入默认是以空格为结束符的,如果想让输入的内容中包含空格,则只需用getline(cin,s)代替cin>>s即可。
而对于char *pchar;这个字符指针变量的输入,可以使用scanf("%s",pchar);参考http://blog.sina.com.cn/s/blog_76e067cf0101771f.html
6、又如:我们编写好的程序,最好在两种字符集的操作系统下都能够兼容。
那如何做到两种字符集都兼容呢?要做如下定义:
#ifdef _UNICODE
#define _tcslen wcslen
#define TCHAR wchar_t
#define LPTSTR wchar_t*
#define _T(x) L##x
#else
#define _tcslen strlen
#define TCHAR char
#define LPTSTR char*
#define _T(x) x
#endif
可以兼容Unicode和ASII码。又如:
TCHAR p[]=TEXT("IT学吧");
//在多字节字符集下
int l1=sizeof(p);
int l2=_tcslen(p);
//在宽字节字符集下
int l3=sizeof(p);
int l4=_tcslen(p);
l1是7,l2是6,l3是10,l4是
4
。