Skip to content

Commit a91d9bf

Browse files
author
Yanbin Zhu
committed
feat(*): 引用与指针的区别
1 parent c6a1ace commit a91d9bf

File tree

1 file changed

+87
-0
lines changed

1 file changed

+87
-0
lines changed
Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
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生成,如有错漏欢迎告知留言

0 commit comments

Comments
 (0)