#include<stdio.h>
#include<stdlib.h>
#include<string.h>
using namespace std;
int main()
{
char *strm=(char *)malloc(sizeof(char)*20);//strcpy成功;
char sstr[20],*sttr=sstr;//strcpy成功
char *strr="mmmmmmmmmmmmmmmmmmmmmmmmmmm",*strr_1=strr; //strcpy 都失败
char *str_cpy="hello world";
//sttr="rrrrrrrrrrrrrrr";
strcpy(strr_1,str_cpy);
//strcmp(strr_1,str_cpy);
printf("%s",strr_1);
free(strm);
}
指针直接指向一个初始化了的字符串,就不能作为目的地址了???
这篇文章你认真读一下:[cpp] 字符数组,字符指针,sizeof,strlen总结
字符串直接量作为字符指针的初始值
"hello"是一个字符串直接量,编译器将其作为const char*处理,与之相关联的内存空间位于内存的只读部分,即允许编译器重用指向等价字符串直接量的引用以优化内存使用,
即使程序 中使用了字符串直接量500次,编译器在内存中也只是创建了一个实例。例如: char *ptr = “hello”; 等价于 const char *ptr = “hello”;
字符串直接量"hello"关联的是只读内存,如果试图修改将出错,例如ptr[1] = ‘a’;是会引起错误的。
我看了 非常棒 thanks~
字符串变量是一个指针,该指针指向的地址就是字符串内容的存储区域。
你使用简单的字符串变量赋值操作,所执行的是字符串地址的赋值。
代码:
char *strr="mmmmmmmmmmmmmmmmmmmmmmmmmmm",*strr_1=strr;
使得两个字符串变量(指针)strr和strr_1共享数据对象。
要想实现字符串的内容赋值操作,就必须使用内存内容复制功能,这个功能在内置函数strcpy里已经实现,当然,假如你想自己实现也不是不可以的,就像我们对数组复制一样。
如果你对数组这个东西了解了的话,那么你把字符串对象当作是一个字符数组来看就没错了。
C/C++是很底层的开发语言,千万别拿java、basic、c#等高级语言里的字符串赋值理念来用到这里,那些高级语言里的赋值操作其实是重载了的,相当于在内部调用了strcpy方法。