如果我不清楚这个问题,请查看下面的代码。为什么带字符的测试工作但不是带整数的测试?字符串文字和数组之间的这个根本区别是什么,我发现很难理解?
using namespace std;
void fun(int &x)
{
cout << x << " okk" << endl;
}
void test (int* &a, int* &b) {
int* temp = a;
a = b;
b = temp;
//cout << *a << " " << &a << endl;
}
void test (char* &a, char* &b) {
cout << &a << " " << &b << endl;
char * temp = a;
a = b;
b = temp;
//cout << *a << " " << &a << endl;
}
int main()
{
char *s = "help";
char *t = "me";
char *u = "help";
cout << s << " " << t << " " << u << endl;
/*char *temp = s;
s = t;
t = temp;
*/
test (s,t);
cout << s << " " << t << endl;
int a[10] = {1,2,3,4,5,6,7,8,9,10};
int b[10] = {11,12,13,14,15,16,17,18,19,20};
cout << *a << " " << *b << endl;
test (a,b);
cout << *a << " " << *b;
}
答案 0 :(得分:2)
int[]
不是int*
,因此您无法传递int[]
预计会有int*&
参考的地方。但是,int[]
确实降级为int*
指针,因此您可以传递int[]
,其中int*
是预期的。 &
引用会产生很大的不同。当您通过引用传递某些内容时,该内容必须与引用引用的数据类型匹配。
答案 1 :(得分:0)
我假设你的意思是:“为什么我可以通过引用传递字符串文字,而不是数组”。
嗯,这个问题存在缺陷,因为事实上你可以通过引用传递一个数组。您也可以通过引用传递字符串文字,但您的代码不是这样做的。您的代码通过引用传递指针。
void test (char* &a, char* &b)
此函数通过引用获取两个指向char(char*
)的指针。
test (s,t);
s
和t
都是char*
(不是字符串文字),所以这是一个正确的调用。另一个测试功能:
void test (int* &a, int* &b)
这也是通过引用获取指针(到int)。但是你试图传递不是指针的数组。作为参考,将字符串文字(const charrs数组)传递给函数将如下所示:
test("help","me")
这不会用你当前的重载进行编译。
答案 2 :(得分:0)
在第一个字符案例中,你是
所以没问题。
在int情况下你是
当使用直接或使用显式指针传递时,数组名称通常被认为具有衰减功能。在传递给函数之前,你的函数期望数组已经衰减到指针中。
在综合中,您需要在要求参考时预先匹配签名的类型。
答案 3 :(得分:0)
在第一种情况下,您使用的是指针
char *s = "help";
char *t = "me";
所以你可以改变它们的价值,因为它们不是恒定的。
考虑到字符串文字具有常量数组的类型。例如,如果您尝试拨打
test ("help", "me" );
您将收到编译错误,如下面考虑的第二种情况。
在第二种情况下,您尝试将对数组的引用转换为对指针的引用。没有这样的隐式和/或显式转换。所以编译器发出错误。
如果你要写
,你可以达到与第一种情况相同的效果int *p = a;
int *q = b;
swap( p, q );