在C++中常量不能赋值,变量才能赋值。C++使用char* 实际上是指向字符串首地址的指针变量。
可以把其他字符串赋值给char*,实际上的操作是把其他字符串的首地址存放到char*指针变量里。
char * pstr = "hello world";
pstr = "maoge";
上面两句代码对char*字符串的操作,是把字符串指针 pstr 指向的首地址从hello world 变换为maoge,修改的为指针变量的值,不是修改字符串常量,是变量赋值操作。
下面为实现字符串strcpy函数的代码:
char* strcpy_m(char* strDest, char* strsrc)
{
assert((strDest != NULL) && (strsrc != NULL));
char* address = strDest;
while (*strsrc != '\0')
{
*strDest = *strsrc;
strsrc++;
strDest++;
}
*strDest = *strsrc;
return address;
}
int main()
{
char pstr[] = "helloworld";
char con[] = "asd";
//这里只能使用char pstr[],不能使用char* pstr,
//使用主要有两点问题:1.使用char* 相当于是对字符串常量进行修改,char* 指向的区域一般是只能读不能写,所以不合法
//2.如果是直接对char* 指向的内存空间进行写入数据,相当于强转为char[]类型,会发生内存空间的溢出,我在vs上进行运行的时候就发生了内存溢出的问题!
strcpy_m(con, pstr);
cout << "con" << con;
return 0;
}
可以参考这篇文章:
实际上, char * a=”string1”; 的写法是不规范的!
因为a指向了即字符常量,一旦strcpy(a,”string2”)就糟糕了,试图向只读的内存区域写入,程序会崩溃的!尽管VS下的编译器不会警告,但如果你使用了语法严谨的Linux下的C编译器GCC,或者在windows下使用MinGW编译器就会得到警告。
所以,我们还是应当按照”类型相同赋值”的原则来写代码: const char * a=”string1”;
保证意外赋值语句不会通过编译。