为什么我可以通过引用调用字符串文字而不是数组?

问题描述:

如果我不清楚这个问题,请看下面的代码。为什么用字符测试而不是用整数测试呢?字符串和数组之间的这种根本区别是什么,我很难找到我的头脑?为什么我可以通过引用调用字符串文字而不是数组?

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

你为什么要打印的char *的的地址? – cppguy

int[]不是int*,所以你不能传递一个int[]其中一个int*&参考预期。但是,int[]确实会降级为int*指针,因此您可以传递int[],其中int*是预期的。参考文献&有很大的不同。当您通过引用传递某些内容时,某些内容必须与引用所引用的数据类型相匹配。

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

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

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

此功能通过参考带有两个指针为char(char*)。

test (s,t); 

stchar*(不是字符串文字),所以这是一个正确的调用。其他测试功能:

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

即也通过引用采取指针(为int)。但是你试图传递数组,而不是指针。作为参考,传递字符串(这是const的字符数组)的功能应该是这样的:

test("help","me") 

而且不会与你有电流过载编译。

+0

好的。我明白了。但是,这是如何有效? 无效美孚(INT * A){ } INT主(){ INT一个[10]; (a); } – shrinidhisondur

+0

@ user2910606:因为'foo'按值取指针,所以它可以接受r值指针。数组衰减为r值指针。但'test'函数通过非const引用引用它的参数,这需要一个l值。 –

+0

非常感谢。我现在明白了。 – shrinidhisondur

第一炭万一你

  1. 实例化一个字符串的只读存储器
  2. 创建指针(不是数组)指向有
  3. 问计于一个参考两个参数的指针

所以没有问题。

在INT万一你

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

数组名常说有一个明确的指针通过两种当直接腐朽功能。你的函数需要的是阵列已经被传递给函数之前腐朽为指针。

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

+0

非常感谢你的回答。在你回答之后,我查看了阵列衰变,并清除了我所拥有的许多东西。 – shrinidhisondur

在第一种情况下,你使用指针

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

,因为他们不是恒定的,你可能会改变他们的价值。

要考虑到字符串字面量有不断类型数组。比如你尝试调用

test ("help", "me"); 

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

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

你可以达到同样的效果在第一种情况下,如果你会写

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

swap(p, q);