0

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

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

4 回答 4

2

Anint[]不是int*,因此您不能在需要引用int[]的地方传递 an 。但是, an确实会降级为指针,因此您可以将 an 传递到预期的位置。参考有很大的不同。当您通过引用传递某些内容时,该内容必须与引用所引用的数据类型相匹配。int*& int[]int* int[]int*&

于 2014-03-25T22:26:08.250 回答
0

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

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

因此,您可能会更改它们的值,因为它们不是恒定的。

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

test ("help", "me" );

你会得到一个编译错误,就像下面考虑的第二种情况一样。

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

如果你写的话,你可以达到与第一种情况相同的效果

int *p = a;
int *q = b;

swap( p, q );
于 2014-03-25T22:33:24.747 回答
0

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

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

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")

这不会与您当前的重载一起编译。

于 2014-03-25T22:27:48.453 回答
0

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

  1. 在只读内存上实例化字符串文字
  2. 创建指向那里的指针(不是数组)
  3. 要求对两个参数的指针的引用

所以没有问题。

在 int 情况下,您是

  1. 创建一个整数数组
  2. 将数组传递给一个函数,该函数需要一个指向 int 的指针的引用。

直接传递或使用显式指针传递时,通常会说数组名称具有衰减的功能。您的函数期望数组在传递给函数之前已经衰减为指针。

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

于 2014-03-25T22:29:43.753 回答