File tree Expand file tree Collapse file tree 1 file changed +87
-0
lines changed Expand file tree Collapse file tree 1 file changed +87
-0
lines changed Original file line number Diff line number Diff line change
1
+ ---
2
+ title : Pointer(指针)与引用的区别
3
+ date : ' 2024-10-20'
4
+ tags : ['C语言','CPP']
5
+ draft : false
6
+ summary : Pointer(指针)与引用的区别
7
+ ---
8
+
9
+
10
+ ## 概念
11
+
12
+ 引用:` 引用是某个变量的别名 ` ,一旦引用被初始化,它就` 不能再指向其他对象 ` 。` 引用必须在声明时初始化 ` 。
13
+
14
+ ``` CPP
15
+ int a = 10 ;
16
+ int & ref = a; // ref 是 a 的引用,ref 就是 a 的别名
17
+ ```
18
+
19
+ 指针:指针是存储某个变量地址的变量。指针可以在任何时候指向不同的对象,并且可以为空(即指向 nullptr)。
20
+
21
+ ``` CPP
22
+ int a = 10 ;
23
+ int * ptr = &a; // ptr 是指向 a 的指针,存储 a 的地址
24
+
25
+ ```
26
+
27
+ ## 底层实现
28
+ 尽管 C++ 语法上将引用和指针区分开来,但在底层,引用通常是通过 指针 或 内存地址 来实现的。编译器在生成代码时,会将引用转换为指针或内存地址的操作。
29
+
30
+ ### 2.1 引用作为指针处理
31
+ 编译器通常会将引用视为指针的别名。这意味着引用在底层实际上是一个指向对象的指针,但编译器对引用进行了语法上的简化,使得程序员不需要显式地解引用。
32
+
33
+ 例如,下面的代码:
34
+ ``` CPP
35
+ int a = 10 ;
36
+ int & ref = a;
37
+ ref = 20 ;
38
+ ```
39
+
40
+ 可能会被编译器转换为类似以下的代码:
41
+ ``` CPP
42
+ int a = 10 ;
43
+ int * const ref = &a; // 引用被实现为指针
44
+ *ref = 20 ; // 对引用的赋值被转换为对指针解引用的赋值
45
+ ```
46
+
47
+ 在这种情况下,ref 在底层被处理为一个指向 a 的指针,ref = 20 实际上是通过 * ref 来修改 a 的值。
48
+
49
+ ### 引用的内存模型
50
+ 引用本身并不占用额外的内存空间,它只是在编译时为某个对象创建了一个别名。因此,` 引用的内存地址与它所引用的对象的内存地址是相同的 ` 。
51
+
52
+ 例如,下面的代码:
53
+ ``` CPP
54
+ int a = 10 ;
55
+ int & ref = a;
56
+
57
+ std::cout << &a << std::endl; // 输出 a 的地址
58
+ std::cout << &ref << std::endl; // 输出 ref 的地址,和 a 一样
59
+ ```
60
+ 输出结果会显示 &a 和 &ref 是相同的地址,因为 ref 实际上是 a 的别名,它们指向同一个内存位置。
61
+
62
+
63
+
64
+ ### 可通过该例题更深刻的理解
65
+ http://oj.lgwenda.com/problem/15
66
+ 使用C++的引用,注意提交时把代码选为C++;
67
+ 在主函数定义字符指针 char * p,
68
+ 然后在子函数内malloc申请空间(大小为100个字节),
69
+ 通过fgets读取字符串,然后在主函数中进行输出;要求子函数使用C++的引用,
70
+ 注意在C++中从标准输入读取字符串,需要使用fgets(p,100,stdin)
71
+ ``` CPP
72
+ #include < stdio.h>
73
+ #include < stdlib.h>
74
+
75
+ void get (char* &i) {
76
+ i = (char * )malloc (100 );
77
+ fgets (i ,100 ,stdin );
78
+ }
79
+
80
+ int main() {
81
+ char * p = nullptr ;
82
+ get (p );
83
+ printf (" %s\n " ,p );
84
+ }
85
+ ```
86
+
87
+ #### 主要部分内容由chatGPT-4o-mini生成,如有错漏欢迎告知留言
You can’t perform that action at this time.
0 commit comments