c++ - 在 C++ 中传递字符数组

标签 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;
}

最佳答案

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

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

modifying the contents of the string in the function, didnt change the content of the array passed

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

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

关于c++ - 在 C++ 中传递字符数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10824612/

相关文章:

c++ - C 和 C++ 静态链接 : just a copy?

c++ - 混合基类的虚拟和非虚拟继承

c++ - 如何在 C/C++ 中释放数组

java - java中的ArrayList和方法

c# - 将字符串变量写入字节数组的一个字节,例如bytes [6] =“c6”

javascript - 根据for循环的索引查找小数指数

c++ - 为 i386 编译 x264

c++ - 用于多个操作系统和库版本的 Jenkins + CMake

C# 拆分数组

javascript - 操作 Array.map 中的前一项?