为什么我可以通过引用调用字符串文字而不是数组?
如果我不清楚这个问题,请看下面的代码。为什么用字符测试而不是用整数测试呢?字符串和数组之间的这种根本区别是什么,我很难找到我的头脑?为什么我可以通过引用调用字符串文字而不是数组?
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;
}
的int[]
不是int*
,所以你不能传递一个int[]
其中一个int*&
参考预期。但是,int[]
确实会降级为int*
指针,因此您可以传递int[]
,其中int*
是预期的。参考文献&
有很大的不同。当您通过引用传递某些内容时,某些内容必须与引用所引用的数据类型相匹配。
我假设你的意思是:“为什么我可以通过引用传递字符串,而不是数组”。
那么,这个问题是有缺陷的,因为你实际上可以通过引用传递一个数组。你也可以通过引用来传递字符串,但是你的代码并没有这样做。您的代码通过引用传递指针。
void test (char* &a, char* &b)
此功能通过参考带有两个指针为char(char*
)。
test (s,t);
s
和t
都char*
(不是字符串文字),所以这是一个正确的调用。其他测试功能:
void test (int* &a, int* &b)
即也通过引用采取指针(为int)。但是你试图传递数组,而不是指针。作为参考,传递字符串(这是const的字符数组)的功能应该是这样的:
test("help","me")
而且不会与你有电流过载编译。
好的。我明白了。但是,这是如何有效? 无效美孚(INT * A){ } INT主(){ INT一个[10]; (a); } – shrinidhisondur
@ user2910606:因为'foo'按值取指针,所以它可以接受r值指针。数组衰减为r值指针。但'test'函数通过非const引用引用它的参数,这需要一个l值。 –
非常感谢。我现在明白了。 – shrinidhisondur
第一炭万一你
- 实例化一个字符串的只读存储器
- 创建指针(不是数组)指向有
- 问计于一个参考两个参数的指针
所以没有问题。
在INT万一你
- 创建整数
- 数组传递给需要一个指针引用int的函数的数组。
数组名常说有一个明确的指针通过两种当直接或有腐朽功能。你的函数需要的是阵列已经被传递给函数之前腐朽为指针。
在综合中,您需要在询问参考时事先匹配签名的类型。
非常感谢你的回答。在你回答之后,我查看了阵列衰变,并清除了我所拥有的许多东西。 – shrinidhisondur
在第一种情况下,你使用指针
char *s = "help";
char *t = "me";
,因为他们不是恒定的,你可能会改变他们的价值。
要考虑到字符串字面量有不断类型数组。比如你尝试调用
test ("help", "me");
,你会得到一个编译错误,如下面考虑第二种情况。
在第二种情况下,您试图将对数组的引用转换为对指针的引用。没有这种隐式和/或显式的转换。所以编译器会发出错误。
你可以达到同样的效果在第一种情况下,如果你会写
int *p = a;
int *q = b;
swap(p, q);
你为什么要打印的char *的的地址? – cppguy