0

在传递用于通过地址(即直接通过其名称或&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;
}
4

2 回答 2

4

您通过value传递一个指针,然后比较指针的地址和副本,这当然不同。如果您想检查它们是否指向相同的内存地址,您可以这样做:

std::cout << (void*)arr << std::endl;

在函数中修改字符串的内容,并没有改变传递的数组的内容

您不是在修改字符串的内容,而是重新分配指针的副本以指向不同的字符串文字。另请注意,修改指向的内存(文字)将是未定义的行为。

编译器让代码通过(即编译它)的唯一原因是有一个向后兼容的特性,它允许你有一个char*指向字符串内容的文字(类型const char[])。你应该得到一个警告,你应该避免这样做。

于 2012-05-30T21:40:09.890 回答
0

仅供参考。我无法评论有关传递字符数组的类似问题,因为它已作为副本关闭,但这个问题相当重要,所以希望你不介意我是否交叉发布。

在生产应用程序中使用字符串时,您通常使用 UTF-8,因为它无需付出太多努力就能显着增加市场。

http://www.joelonsoftware.com/articles/Unicode.html

大多数应用程序还使用字符串类来封装字符。然后你可以使用类似的东西:

void fn(..., const std::string &static_string, ...);

在你的标题中。如果您使用像 gettext 这样的库,您的代码如下所示:

printf(gettext("突然有一行很好.."));

其中英文字符串充当本地化文件的直观索引,您可以在安装或运行时快速轻松地切换语言。

如果您因为使用 C 而不能使用类,那么 gettext 文档也涵盖了这种情况。

于 2014-02-27T02:42:17.277 回答