在C ++中传递字符数组

时间:2012-05-30 21:36:31

标签: c++ arrays

在传递用于通过其地址引用字符串的字符指针(即直接通过其名称或&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;
}

2 个答案:

答案 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文档也会涵盖此案例。