Solmyr 小品文学习之一探索字符串

mac2025-04-23  7

一、探索字符串

区分存储的位置

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 会报错,常量是不可改的!

 

问题二:

深浅拷贝

如果直接用=赋值,就是浅拷贝,都指向同一块内存,会互相影响。

深拷贝就是重新申请一块内存,复制原先那块内存的内容,且指针指向该块新内存的首地址。

最新回复(0)