string,char的传递

本文通过几个实例深入探讨了Java中String和数组作为参数传递时的行为差异,特别是值传递与引用传递的区别,以及String不可变性的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

从一道面试题开始:

 1 public class test1{
 2     String str=new String("good");
 3     char[] ch={'a','b','c'};
 4     public static void main(String[] args){
 5         test1 ex=new test1();
 6         ex.change(ex.str,ex.ch);
 7         System.out.println(ex.str+"and");
 8         System.out.println(ex.ch);
 9     }
10     public void change(String str,char ch[]){
11         str="test ok";
12         ch[0]='g';
13     }
14 }

运行的结果是

goodand
gbc

这道题很简单,主要考察的是值传递与引用传递,我想大家都很清楚。

由这道题出发,我主要想讨论一下的是string和char[]传递的区别。虽然string不属于基本数据类型,理应是引用传递,但为什么会出现上面的结果。

为此,我们再看一段代码 :

 1 class test1{
 2     public static void main(String[] args){
 3         String s="aa";
 4         int i=System.identityHashCode(s);
 5         System.out.println(i);
 6         System.out.println("-----------------");
 7         test(s);
 8     }
 9     public static void test(String s){
10         int i=System.identityHashCode(s);
11         System.out.println(i);
12         System.out.println("-----------------");
13         s="dd";
14         int j=System.identityHashCode(s);
15         System.out.println(j);
16     }
17 }

运行结果为

366712642
-----------------
366712642
-----------------
1829164700

从上面4、5和10、11可以看出,当初始传过去的时候,main中的s和test中的s指向同一个地址,当我们给s赋值后,s指向了另一区间。为了说明问题,我们再看看char[]传递:

 1 class test1{
 2     public static void main(String[] args){
 3         char[] a={'1'};
 4         int i=System.identityHashCode(a);
 5         System.out.println(i);
 6         System.out.println("-----------------");
 7         test(a);
 8     }
 9     public static void test(char[] s){
10         int i=System.identityHashCode(s);
11         System.out.println(i);
12         System.out.println("-----------------");
13         s[0]='d';
14         int j=System.identityHashCode(s);
15         System.out.println(j);
16     }
17 }

结果为

366712642
-----------------
366712642
-----------------
366712642

char[]传递的三个结果是一样的,为此我们可以明白了最初的面试题的结果。

总结:string传递过去后和原变量指向同一地址,但当给string赋值后string指向了不同的地址,这正是string的不变性,对这一点可以做如下解释,

      当给string赋值时会先去常量池里去找有没有这一变量,如果有,就让string指向这一地址,如果没有则新开辟一个。如下代码:

class test1{
    public static void main(String[] args){
        String s="1";
        int i=System.identityHashCode(s);
        System.out.println(i);
        System.out.println("-----------");
        String s1="1";
        int i1=System.identityHashCode(s1);
        System.out.println(i1);
    }
    
}
结果
366712642
-----------
366712642

 

转载于:https://www.cnblogs.com/Jc-zhu/p/4052468.html

在C++中,`string`(来自标准模板库STL)和`char[]`(字符数组)之间的相互转换是非常常见的操作。这两种类型都可以表示字符串信息,但在语法和功能上有一定的差异。接下来我会详细介绍如何在这两者之间进行安全可靠的转换。 ### 将 `string` 转换为 `char[]` #### 方式一:使用成员函数 `.c_str()` 或者 `.data()` `.c_str()` 返回一个指向以空终止符结束 (`\0`) 的连续字符数组的指针,该数组内容与当前字符串相同;`.data()` 同样返回内部缓冲区的一个指针,在大多数现代编译器环境下也会包含结尾的 `\0` ,但最好还是优先选择 `.c_str()` 来确保兼容性和安全性。 ```cpp #include <iostream> #include <cstring> // for strcpy_s or strncpy using namespace std; int main(){ string str = "Hello"; // 创建足够大的字符数组来接收转换结果 char charArray[str.size() + 1]; // 加1是为了容纳'\0' // 方法1:使用 c_str() // 安全地复制字符串到字符数组中 (推荐) #ifdef _MSC_VER // Microsoft Visual Studio特定宏定义 strcpy_s(charArray, str.c_str()); #else strcpy(charArray, str.c_str()); #endif cout << "Converted to char*: " << charArray << endl; } ``` #### 方式二:直接遍历赋值(适用于小型应用场合) 对于简单的场景也可以通过循环逐个字符复制过去: ```cpp for(size_t i=0;i<str.length();++i){ charArray[i] = str[i]; } charArray[str.length()]='\0';//别忘了加字符串终结标志位 ``` 不过这种方式效率较低且容易出错,所以一般不建议这样做除非必要情况下的特殊需求优化。 ### 将 `char[]` 转换成 `string` 这种转换相对简单很多,只需要构造新的`string`对象并将原始的`char[]`传递进去即可: ```cpp #include <string> using namespace std; int main(){ char charArray[] = {'H', 'e', 'l', 'l', 'o', '\0'}; // 构造一个新String实例,并传入字符数组作为初始值 string newStr(charArray); cout << "Converted back to String: "<<newStr<<endl; } ``` 另外还可以利用带两个参数的形式初始化一个范围内的字符数组片段成为新的`string`: ```cpp string subStr(&charArray[1], &charArray[4]); // 截取 e-l-l 部分形成子串 ``` 总结来说就是根据实际应用场景选取合适的方式来完成二者间高效的互相转变。值得注意的是每次做这样的转型时都要考虑到源数据的有效长度及是否已添加了必要的字符串终止单元(`\0`)等问题以免引起程序异常崩溃或其他不确定的行为发生。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值