为什么我可以通过引用而不是数组来调用String Literal?

时间:2014-03-25 22:16:15

标签: c++ pass-by-reference pass-by-pointer

如果我不清楚这个问题,请查看下面的代码。为什么带字符的测试工作但不是带整数的测试?字符串文字和数组之间的这个根本区别是什么,我发现很难理解?

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;

}

4 个答案:

答案 0 :(得分:2)

int[]不是int*,因此您无法传递int[]预计会有int*& 参考的地方。但是,int[]确实降级为int* 指针,因此您可以传递int[],其中int*是预期的。 &引用会产生很大的不同。当您通过引用传递某些内容时,该内容必须与引用引用的数据类型匹配。

答案 1 :(得分:0)

我假设你的意思是:“为什么我可以通过引用传递字符串文字,而不是数组”。

嗯,这个问题存在缺陷,因为事实上你可以通过引用传递一个数组。您也可以通过引用传递字符串文字,但您的代码不是这样做的。您的代码通过引用传递指针。

void test (char* &a, char* &b)

此函数通过引用获取两个指向char(char*)的指针。

test (s,t);

st都是char*(不是字符串文字),所以这是一个正确的调用。另一个测试功能:

void test (int* &a, int* &b)

这也是通过引用获取指针(到int)。但是你试图传递不是指针的数组。作为参考,将字符串文字(const charrs数组)传递给函数将如下所示:

test("help","me")

这不会用你当前的重载进行编译。

答案 2 :(得分:0)

在第一个字符案例中,你是

  1. 在只读内存上实例化字符串文字
  2. 创建指向
  3. 的指针(不是数组)
  4. 要求引用两个参数的指针
  5. 所以没问题。

    在int情况下你是

    1. 创建整数数组
    2. 将数组传递给期望引用指向int的指针的函数。
    3. 当使用直接使用显式指针传递时,数组名称通常被认为具有衰减功能。在传递给函数之前,你的函数期望数组已经衰减到指针中。

      在综合中,您需要在要求参考时预先匹配签名的类型。

答案 3 :(得分:0)

在第一种情况下,您使用的是指针

char *s = "help";
char *t = "me";

所以你可以改变它们的价值,因为它们不是恒定的。

考虑到字符串文字具有常量数组的类型。例如,如果您尝试拨打

test ("help", "me" );

您将收到编译错误,如下面考虑的第二种情况。

在第二种情况下,您尝试将对数组的引用转换为对指针的引用。没有这样的隐式和/或显式转换。所以编译器发出错误。

如果你要写

,你可以达到与第一种情况相同的效果
int *p = a;
int *q = b;

swap( p, q );