一、探索字符串
区分存储的位置
char szBuf[] = "Hello";
位置:栈区
char* pStr = new char[sizeof(szBuf)];
strcpy(pStr, "Hello");
位置:堆区
char* pStr = “Hello”;
位置:文字常量区
思考:
问题一:以上类型定义是否都正确?
问题二:两个字符串为什么不直接用=赋值?
简答:
问题一:
char* pStr = “Hello”;
因为“Hello”存放在文字文字常量区,所以这里应该是一个常量字符串。
const char* cpStr = "Hello";
假设1:
const char* cpStr1 = "Hello";
const char* cpStr2 = “Hello”;
cout << (int)cpStr1 << endl;
cout << (int)cpStr2 << endl;
输出结果会是什么?
相等,编译器做了优化,只保存了一份“Hello”。
假设2:
char* pStr1 = "Hello";
char* pStr2 = “Hello”;
pStr1[0] = 'a';
cout << pStr2 << endl
输出结果会是什么?
VC6.0 会输出 “aello”,说明编译器做了优化,只保存了一份“Hello”。
VS2010 会报错,常量是不可改的!
问题二:
深浅拷贝
如果直接用=赋值,就是浅拷贝,都指向同一块内存,会互相影响。
深拷贝就是重新申请一块内存,复制原先那块内存的内容,且指针指向该块新内存的首地址。