深究指针与引用的差别

学习C++很长时间,一直没有深究过引用与指针,感觉应该深入的了解下它们的区别:

由指针定义知,是指向内存中某个存储体对象的变量。它可以指向简单变量, 数组,结构体等,甚至函数 (函数指针)。个人在此有一个疑问,既然指针是指向存储体的变量,而函数没有存储性质,那函数指针如何实现的?

我是从这感觉函数没有存储性质:

class  A{
   int  i;
 int fun(int );
};
大家都知道这个类内存中sizeof(A)= 4; 即它的内存完全是分配给(int)变量的。所以它的成员函数(int  fun(int))没有存储性质。所以就不明白函数指针的实现?

不知道上面的推理正确吗? 还请大神指点

先绕过这个问题,我们继续说指针和引用

引用的定义很简单,就是对象的别名。是一种复合类型,不能定义引用类型的引用,可以定义其他类型的引用。

具体来说引用和指针有以下几点区别:

 1: 非空区别。 任何情况下都不能使用指向空值的引用。一个引用必须总是指向某些对象。因此如果你使用一个变量并让它指向一个对象,但该变量可能某段时间不指向任何对象,你就应该声明一个指针。因为你可以赋空值给该指针。相反,如果你可以确定变量一直指向某个对象,就可以使用引用。不存在指向空值的引用。


2: 合法性区别。使用引用可以不用测试它的合法性,但是指针就必须测试它的合法性,防止空指针。就好比有指针传入函数,函数就必须检测指针的合法性。


3:可修改性。指针可以被修改指向不同的对象。但是引用一直指向初始化时被指向的对像,不能改变,但指向对象的内容可以改变。有些像 int  * const  A ;这个变量。所以引用的初始化很重要。


4: 应用区别。总的来说,以下情况使用指针,一是考虑到可能存在不指向任何对象时候(空值);二是 存在需要指向其他对象的情况。如果需要一个指向一个一直存在的对象,并且不改变它的指向的对象就可以使用引用。



为了帮助更好地学习《C++ Primer Plus 第6版》,以下是一些深入解析和相关学习资源的推荐,结合了本书的核心内容实践方法。 ### 重点章节深入解析 #### 第2章:开始学习C++ 本章介绍了如何编写一个简单的C++程序,包括`#include`指令、命名空间、主函数以及基本的输入输出操作。建议通过实际编写并调试多个“Hello World”变体程序来加深理解,例如添加变量声明和基本运算[^5]。 #### 第3章:数据处理 该章节涵盖了C++的基本数据类型,特别是整型和浮点型的使用。由于C++支持多种数据类型,理解每种类型的适用场景非常重要。例如,`short`通常用于节省内存的情况,而`long long`适用于需要大范围数值的情形。可以通过编写程序测试不同数据类型的大小和范围[^2]。 #### 第4章:复合类型 本章讨论了数组、结构体、指针等复合数据类型。这些是构建复杂数据结构的基础。例如,定义一个包含多个字段的结构体,并使用指针访问其成员,有助于掌握这些概念的实际应用。 #### 第5章:循环和关系表达式 循环控制结构(如`for`、`while`和`do-while`)是程序设计中的重要组成部分。本章还介绍了如何使用关系运算符进行条件判断。建议通过实现一些简单的算法(如排序或查找)来练习这些技能[^5]。 #### 第6章:分支语句和逻辑运算符 本章讲解了`if`、`else if`和`switch`语句的使用,以及逻辑运算符在条件判断中的作用。可以通过编写一个简单的菜单驱动程序来练习这些概念[^5]。 #### 第7章:函数——C++的编程工具 函数是模块化编程的核心。本章详细介绍了函数的定义、调用、参数传递方式(按值、按引用)以及递归函数的设计。可以尝试编写一个递归函数来计算阶乘或斐波那契数列[^5]。 #### 第8章:函数探幽 深入探讨了函数的一些高级特性,如内联函数、函数重载、默认参数等。例如,定义一个带有默认参数的函数,并尝试不同的调用方式[^1]。 #### 第9章:内存模型和名称空间 本章涉及作用域、存储持续性以及名称空间的概念。理解这些对于编写大型应用程序至关重要。可以通过创建多个源文件并在其中使用全局变量和静态变量来实践这些概念[^5]。 ### 相关学习资源 1. **官方配套网站** C++ Primer Plus 官方网站提供了书中示例代码、勘误表以及其他补充材料。访问地址通常是出版社官网的相关书籍页面。 2. **在线课程** - [Coursera](https://www.coursera.org) 上有几门关于C++的入门和进阶课程,适合系统性学习。 - [Udemy](https://www.udemy.com) 提供了一些实战项目导向的C++课程,适合动手实践。 3. **社区论坛** - [Stack Overflow](https://stackoverflow.com/questions/tagged/c%2b%2b) 是解决具体问题的好地方,几乎任何常见的C++问题都能在这里找到答案。 - [Reddit 的 r/learnprogramming 和 r/cpp](https://www.reddit.com/r/learnprogramming/) 社区活跃,适合交流经验和获取学习建议。 4. **开源项目** GitHub 上有许多基于C++的开源项目,参这些项目可以帮助你提高编码能力和理解实际开发流程。可以从简单的项目开始,如实现一个小型游戏或工具。 5. **书籍推荐** - 《Effective Modern C++》 by Scott Meyers —— 深入理解C++11/14新特性。 - 《C++标准库》 by Nicolai M. Josuttis —— 全面介绍C++标准库的使用。 ### 示例代码:函数指针数组 下面是一个使用函数指针数组的例子,展示了如何将多个函数组织在一起并通过索引调用它们: ```cpp #include <iostream> using namespace std; // 函数原型 double f1(const double ar[], int n); double f2(const double ar[], int n); double f3(const double ar[], int n); // 类型别名 typedef double (*p_fun)(const double ar[], int n); p_fun pa[] = {f1, f2, f3}; // 函数指针数组 int main() { const double arr[] = {1.0, 2.0, 3.0, 4.0, 5.0}; int size = sizeof(arr) / sizeof(arr[0]); for (int i = 0; i < 3; ++i) { cout << "Result of function " << i+1 << ": " << pa[i](arr, size) << endl; } return 0; } // 函数定义 double f1(const double ar[], int n) { double sum = 0; for (int i = 0; i < n; ++i) { sum += ar[i]; } return sum / n; } double f2(const double ar[], int n) { return ar[0]; } double f3(const double ar[], int n) { return ar[n - 1]; } ``` 这段代码演示了如何定义和使用函数指针数组,这对于实现状态机或多态行为非常有用。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值