指针字符串修改问题、static

/在论坛看见这种问题的帖子,看见有人说的很好就把它搬过来了/

char *m = "hello";//相当于const char *m="hello";

"hello"保存在静态数据区,该数据不能修改.
由指针m指向. 不能通过指针m来修改静态数据区的值.

char w[] = "hello";
"hello"保存在栈空间数组里. 数组名为w, 函数名为数组的首地址.
可以通过w[i]='a', 或*(w+i)='a'的形式来修改数组内容.
字符串“hello”本身就是一个常量字符指针,而对于指针m,无非就是一个地址的拷贝,也就是“hello”地址的拷贝,相当于m指向一个字符串常量,字符串常量是不予许改变的!

而对于w[]来说就不一样了,虽然hello本身是常量,不过此时拷贝给w[]的不是地址,而是内容,也就是“hello”,也就是w本身拥有一个自己的hello副本,可以对其进行想要的合法操作,比如改变等!!

  static作用:1.用于隐藏变量,即别的.c文件不能访问 2.定义为static的变量不会释放,下次调用的时候还会接着上次保留的值继续使用

### C++ 中指针指向字符串的方法 在 C++ 中,可以通过字符指针来操作字符串。当声明一个 `char *` 类型的变量时,这个变量实际上是指向单个字符或字符数组首地址的指针。 #### 声明与初始化 可以直接将字符串字面量赋予字符指针: ```cpp const char *p = "Hello world"; ``` 这里需要注意的是,由于字符串字面量是常量,在现代编译器中通常会自动将其视为 `const char[]` 或者 `const char*` 来防止意外修改[^2]。 也可以让指针指向已存在的字符数组的第一个元素: ```cpp char s[] = "Hello world"; char *q = s; ``` 此时 q 和 p 都指向了各自的字符串起始位置,但是只有通过 q 修改其对应的字符串才是安全合法的操作,因为 s 是可变的而非只读属性。 #### 输出指针所指向的内容 对于普通的非字符类型的指针,默认情况下 cout 会尝试输出它们代表的对象而不是实际地址;然而一旦涉及到了 `char*` ,cout 则会被重载成按照连续字符序列的形式展示出来直至遇到终止符 `\0` 。为了得到真正的内存地址,需要显式地转换类型: ```cpp std::cout << static_cast<void*>(static_cast<const void*>(p)) << '\n'; // 或者更简单的方式是在某些平台上直接强转为其他指针类型比如 int* std::cout << reinterpret_cast<int*>(p); ``` 上述代码片段展示了如何正确获取并打印出指针本身的数值表示形式即地址值。 #### 动态分配空间存储字符串 有时可能希望程序运行期间根据需求创建新的字符串副本而不影响原始数据源。这时就需要利用 new 运算符申请堆区上的临时缓冲区,并复制目标串进去: ```cpp size_t length = strlen(s)+1; // 计算所需长度加结束标记位 char *copy = new char[length]; strcpy(copy,s); // ... do something with copy ... delete [] copy; // 不再使用后记得释放资源以免泄漏 ``` 这段示范说明了怎样手动管理动态分配的空间以及确保不会造成内存溢漏问题[^4]。 #### 函数参数传递方式 当设计接受字符串作为输入参数的功能模块时,既可以采用传入整个数组的方式(隐含传递基址),也能选择单独给出指针变量。后者往往更加灵活高效,尤其是在面对大型文本块的时候能够减少不必要的拷贝开销。 例如实现删除指定字符功能的小例子如下所示: ```cpp void delchar(char *str, char c){ if (!str || !*str) return; size_t writePos=0; for(size_t readPos=0 ; str[readPos]!='\0' ; ++readPos ){ if(str[readPos]!=c) str[writePos++]=str[readPos]; } str[writePos]='\0'; } ``` 此函数接收两个实参——待处理的目标字符串及其头部地址还有想要移除掉的那个特定字母。遍历过程中跳过匹配项并将剩余部分向前移动覆盖原处即可达到目的[^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值