Archive for the ‘C++’ Category

在《C++大学教程》第三版的第四章《引用变量》看到这样一句话:

C++中的引用变量是C中没有的。

很疑惑,C中不也有&符号吗?不过那里是叫取地址符。这两个有什么区别呢?

在网上搜了搜,自己写了以下一段代码来区分它们:

 C++ |  copy code |? 
01
02
#include <iostream>
03
using std::cout;
04
using std::endl;
05
void init(char ** ptr){
06
*ptr = "this is c style";
07
}
08
void init(char * &amp;ptr){
09
ptr = "this is c++ style";
10
}
11
int main(){
12
char * ptr;
13
init(&amp;ptr); // 取地址符
14
cout &lt;&lt; ptr &lt;&lt; endl;
15
init(ptr); // 引用调用
16
cout &lt;&lt; ptr &lt;&lt; endl;
17
return 0;
18
}

可以看出,C++中的引用变量,其实也是把变量所在地址给传递过去,但是使用起来,却不像指针那样还需要解引用(*)。这样就给编程带来了一定的便利。

那么引用和指针又有什么区别呢?

首先,引用必须在声明的同时初始化。而指针不必。

其次,引用变量不可改变,引用变量指向的对象内容可以改变。所以,没有这样的声明方式:int &const pi = 1; 因为pi本来就是const的了。

为了加深对c++的了解,做了习题:

 C++ |  copy code |? 
01
// learning C++ 4.1
02
 
03
void swapByPointer (int * p1, int * p2){
04
 
05
*p2 = *p1 + *p2;
06
 
07
*p1 = *p2 - *p1;
08
 
09
*p2 = *p2 - *p1;
10
 
11
}
12
 
13
void swapByRef(int &amp; p1, int &amp; p2){
14
 
15
p2 = p1 + p2;
16
 
17
p1 = p2 - p1;
18
 
19
p2 = p2 - p1;
20
 
21
}
22
 
23
// learning C++ 4.2
24
 
25
void find(int const * array, std::size_t const dim, int &amp;min, int &amp;max){
26
 
27
if (dim &lt;= 0){
28
 
29
return ;
30
 
31
}
32
 
33
min = array[0];
34
 
35
max = array[0];
36
 
37
for(std::size_t i = 1; i &lt; dim; ++i){ if (array[i] &gt; max){
38
 
39
max = array[i];
40
 
41
}
42
 
43
if (array[i] &lt; min){
44
 
45
min = array[i];
46
 
47
}
48
 
49
}
50
 
51
}

那么int *& 与 int &的区别是什么呢?

 C++ |  copy code |? 
01
int *i = new int(1);
02
 
03
int &amp; ri = *i;
04
 
05
cout &lt;&lt; ri &lt;&lt; endl;
06
 
07
int* &amp; rpi = i;
08
 
09
cout &lt;&lt; *rpi &lt;&lt; endl;
10
 
11
int j = 1;
12
 
13
int &amp; rj = j;
14
 
15
//int* &amp; rpj = &amp;j; // error: 将类型为 ‘int*&amp;’ 的非 const 引用初始化为类型为 ‘int*’ 的临时变量无效
16
 
17
int * p = &amp;j;

可以看出,int & ri = *i; 声明的ri是一个指向int型的引用(即*i的值),如果i=new int(2),ri的内容也不会发生变化;而int* & rpi = i;声明的rpi是指向int指针的引用,所以如果i=new int(2),rpi的内容会随之变化。

同时,由上面的error语句也可以看出,引用与取地址是不同的!(不过这里还有一点迷糊)