char* const cp 和 const char* p 的区别
0.char* const cp 和 const char* p 的区别
char * const cp : 定义一个指向字符的指针常数,即const指针
其实const 放在cp前证明cp是一个const,cp是不允许改变的
const char* p : 定义一个指向字符常数的指针
同理,const 是c描述char的,char是const,所以指针可变
char const* p : 等同于const char* p
const char **p是一个指向指针的指针,那个指针又指向一个字符串常量。
char ** p也是一个指向指针的指针,那个指针又指向一个字符串变量。
- const char* 和string 转换
(1) const char*转换为 string,直接赋值即可。
EX: const char* tmp = "tsinghua".
string s = tmp;
(2) string转换为const char*,利用c_str()
EX: string s = "tsinghua";
const char*tmp = s.c_str();
- char和const char之间的转换
(1) const char转化为char,利用const_cast<char*>
EX: const char* tmp = "tsinghua";
char* p = const_cast<char*>(tmp);
(2) char转化为const char,直接赋值即可。
char* p = "tsinghua".
const char* tmp = p;
- char*和string之间的转换
有了1和2的基础,char*和string转化就很简单了。
(1)char*转化为string,直接赋值即可。
EX: char* p = "tsinghua".
string str = p;
(2)string转化为char*,走两步,先是string->const char*,然后是const char*->char*
EX: string str = "tsinghua";
char* p = const_cast<char*>(str.c_str()):
复制代码
String类是不可变(final)的,对String类的任何改变,都是返回一个新的String类对象.这样的话把String类的引用传递给一个方法,该方法对String的任何改变,对原引用指向的对象没有任何影响,这一点和基本数据类型相似.
1
2
3
4
Strings1,s2;
s1=“abc”;
s2=s1;
s2=“def”;
//这样操作之后s1是"abc",s2是"def".
1
2
3
4
5
6
stringa=“hello,world!”;
stringb=“hello,world!”;
stringc=“hello!”;
stringa=“hello,world!”;
stringb=“hello,world!”;
stringc=“hello!”;
a 和 b 是不是指向同一个地址呢,这个问题在各论坛都是谈论很激烈,其实很简单,跟下这些字符串的内存地址就好了
1
stringa=“hello,world!”;
1
2
00000042moveax,dwordptrds:[02A62208h]
00000048movdwordptr[ebp-44h],eax
1
stringb=“hello,world!”;
1
2
0000004bmoveax,dwordptrds:[02A62208h]
00000051movdwordptr[ebp-48h],eax
1
stringc=“hello!”;
1
2
00000054moveax,dwordptrds:[02A756F8h]
0000005amovdwordptr[ebp-4Ch],eax
a的地址指向02A62208h,b的地址也是02A62208h,这说明了什么,创建b的时候.net机制肯定是先去查找内存中是否有这个字符串的内存地址,如果有则指向,没有才创建[1]
复制代码