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