在传递用于通过其地址引用字符串的字符指针(即直接通过其名称或&name[0]
)时,原始字符串必须通过,因为我们正在通过地址传递。
然而,在执行下面的代码之后,我得到了第一个元素的两个不同的地址值,令人惊讶的是,它们相距2个字节。
另外,修改函数中字符串的内容,没有改变传递的数组的内容,但这是因为新的字符串会生成一个新的地址,对吧?
但是关于第一个元素的地址不同,这怎么可能?
#include<conio.h>
#include<stdio.h>
#include<iostream.h>
void fn(char *arr)
{
cout<<endl<<&arr;
arr="hi";
}
void main()
{
clrscr();
char *arr="hey";
cout<<endl<<"main "<<&arr;//the address is different from that in fn
fn(arr);
cout<<endl<<arr;
}
答案 0 :(得分:4)
您正在通过值传递指针,然后比较指针和副本的地址,这当然不同。如果要检查它们是否指向相同的内存地址,则可以执行此操作:
std::cout << (void*)arr << std::endl;
修改函数中字符串的内容,没有改变传递的数组的内容
您不是在修改字符串的内容,而是重新指定指针的副本以指向不同的字符串文字。另请注意,修改指向的内存(文字)将是未定义的行为。
编译器让代码通过(即编译它)的唯一原因是有一个向后兼容性功能,允许你有一个char*
指向一个字符串的内容一个文字(类型) const char[]
)。你应该收到警告,你应该避免这样做。
答案 1 :(得分:0)
只是一个FYI。我无法对关于传递字符数组的类似问题发表评论,因为它是作为副本关闭的,但问题非常重要,所以希望你不介意我是否交叉发布。
在生产应用程序中使用字符串时,您通常使用UTF-8,因为它可以在不费力的情况下显着增加市场。
http://www.joelonsoftware.com/articles/Unicode.html
大多数应用程序还使用字符串类来封装字符。然后你可以使用类似的东西:
void fn(...,const std :: string&amp; static_string,...);
在标题中。如果您使用类似gettext的库,则代码如下所示:
printf(gettext(“突然有一行很好......”));
其中英语字符串充当本地化文件的直观索引,您可以在安装或运行时快速轻松地切换语言。
如果因为使用C而无法使用类,则gettext文档也会涵盖此案例。