上午搞了一个小程序,test半天都没有得到想要的结构,原来是递归的时候没有注意的循环的问题,结果直接死循环了。催了...看来当程序出现问题的时候,首先要整理的是算法思路是否有问题,其次是算法的实现,是否容易进入死循环,边界条件是否出现错误。

好的,废话不多说,继续整理。

指针

       指针这东西,要是搞复杂了,这还真是高深莫测,你不认真研读研读还真不行,真心觉得搞程序一浮躁,各种bug就都出来了。

指针的声明:

     int x=;
int *p,q;
int* m,n;
p=&x;
q=x;
m=&x;
n=x;
cout<<*p<<" "<<q<<" "<<*m<<" "<<n;

我想,这应该就是最简单的声明了吧,p是一个指针,并且是一个指向x的指针。那么如果cout<<p;会得到什么结构呢?其实p本身保存的是一个地址。并且保存的是x所存储的地址。

不信的话可以改成以下语句:

     int x=;
int *p,q;
int* m,n;
p=&x;
q=x;
m=&x;
n=x;
cout<<p<<" "<<&x<<" "<<m;

他的输出结果就是:

所以,在这里我们已经对指针有一个初步的认识,指针其实就是一个地址的东西,只不过这个地址保存的是我们所指向的值得地址。

 空指针void*

我们一般的指明了指向类型的指针都是只能指向该类型的,比如说上面提到的p指针,它只能指向Int类型。但是void*是怎么样的呢?

其实void*指针可以指向任何类型,当然也可以指向int。如果我们下面代码会出现什么情况呢?

     void *y;
y=&x;
cout<<y;

实际上我们会发现,y输出的是地址,并且和上面的P,m的地址是一致的,实验发现,我上面的说法是对的。

很显然,如果仅仅得到一个void*指针是没有太大意义的,那么我们怎么把他转化成原有的int*,甚至转化成int呢?

这里我们需要显示转化,(int*)y,转化成整数的话就是*((int*)y);

所以现在我们应该知道了当函数的返回值是void和void*是有多么大的不同了吧。void*是返回一个特殊的指针类型。

 多重指针

这里说的多重指针在很多地方也称为指向指针的指针。

我们是不是经常会遇到int **m;这种情况呢,其实他就是一个多重指针。

还是上面那个例子,我们以下定义一个多重指针

     int **z;
z=&p;
cout<<"多重指针"<<p<<*z;

p我们知道会输出x的地址,那么*z又是上面呢,z是一个指向指针p的指针。那么z保存的是p的地址,*z理所当然的应该保存的也是x的地址。见下图

了解了这个之后,那么我们就很容易的知道了,动态二维数组的创建过程了,就是一个指向指针的指针,二重指针嘛,so easy。

 函数指针

我们经常会需要动态的调动几个函数的某一个,如果我们只是if else那代码量可能有时候会比较大,有没有可以在函数参数中直接传递一个函数呢?

答案是不可能的,但是我们有一种方式可以实现,那就是通过指针函数来说。

typedef void (*pf)(int &m,int *n);

这是什么意思呢?他的意思就是说pf是一个指针函数,他可以指向任意的返回值为void,并且参数是int &m和int *n的函数。

同样我们声明pf f;就可以把f作为一个函数了,也可以把f当做一个参数传到函数体中了。具体例子见下面。

 void swap(int &m,int *n); //定义一个有两个参数的函数swap
typedef void (*pf)(int &m,int *n);//
void print(int &m,int *n,pf x);//定义一个能传递指针函数的函数
int _tmain(int argc, _TCHAR* argv[])
{
int m=,q=;
pf f=swap;
int* n=&q;
f(m,n);
cout<<&m<<*n;
print(m,n,f);
system("pause");
return ;
}

同样的道理,我们也可以返回一个指针函数,只不过返回类型是pf。它返回的实际类型应该是 void (*)(int&,int*);解释起来就是一个指向两个传输的函数指针。

我们可以定义一个 pf fun();他就返回的是函数指针了。

引用&

实际上引用能起到的作用,*很多时候也能够起到,那为什么我们还经常说,要尽量使用引用呢?最大的优点就是指针更安全。当然某些情况下例外。

引用可以认为是一个别名,而指针则是一个实体,虽然他们都有地址的概念在里面。

这里主要描述一下引用和指针的不同之处。

1、指针是可以重新指向另外一个对象,而引用不行,引用一旦绑定那就不能再绑定其他了,引用的这种性质有一点嫁鸡随鸡嫁狗随狗的意味在里面。这对男人是不是更安全呢?O(∩_∩)O哈哈~

2、指针可以是空指针,但是引用不能是空引用啊,所以引用都是必须初始化的。

3、指针是指向一个实体(程序为指针变量分配内存区域),而指针则是一个别名,这个可以怎么理解呢?我们通过sizeof(指针)和sizeof(引用)可以知道,前者是指针的大小,一般为4,而后者则是引用对象的大小,也就是说,如果对一个字符串长度为100的字符串进行引用sizeof是100哦,而指针还是4.

4、如果需要返回动态分配的对象或者内存,应该使用指针,引用很有可能引起内存泄露问题。

当然还有其他的一些不同,但是总体来说都是由以上衍生出来的。

其实引用本质上来说是一种指针,只不过编译器进行了优化(所以指针更加灵活),所以引用具有指针的特点,又更安全。

版权所有,欢迎转载,但是转载请注明出处:潇一

C++指针、引用知多少?的更多相关文章

  1. CVE-2014-0160 Heartbleed Vul Analysis && OpenSSL Cryptographic Software Library Bug

    目录 . Heartbleed漏洞简介 . 漏洞造成的风险和影响 . 漏洞的测试.POC . OpenSSL漏洞源代码分析 . 防御.修复方案 . 从漏洞中得到的攻防思考 1. Heartbleed漏 ...

  2. 通俗大白话来理解TCP协议的三次握手和四次断开

    from : https://blog.csdn.net/Neo233/article/details/72866230?locationNum=15&fps=1%20HTTP%E6%8F%A ...

  3. 通俗大白话来理解TCP协议的三次握手和四次分手

    通俗理解: 但是为什么一定要进行三次握手来保证连接是双工的呢,一次不行么?两次不行么?我们举一个现实生活中两个人进行语言沟通的例子来模拟三次握手. 引用网上的一些通俗易懂的例子,虽然不太正确,后面会指 ...

  4. 通俗了解TCP/IP三次握手四次挥手

    前言: tcp/ip通信机制是计算机中很重要的一个知识点,不是一句两句就能解释清楚的,需要反复推敲其中的玄妙. 通俗理解: 但是为什么一定要进行三次握手来保证连接是双工的呢,一次不行么?两次不行么?我 ...

  5. Go语言的9大优势和3大缺点, GO语言最初的定位就是互联网时代的C语言, 我为什么放弃Go语言

    Go语言的9大优势和3大缺点 转用一门新语言通常是一项大决策,尤其是当你的团队成员中只有一个使用过它时.今年 Stream 团队的主要编程语言从 Python 转向了 Go.本文解释了其背后的九大原因 ...

  6. 深入理解JavaScript执行上下文、函数堆栈、提升的概念

    本文内容主要转载自以下两位作者的文章,如有侵权请联系我删除: https://feclub.cn/post/content/ec_ecs_hosting http://blog.csdn.net/hi ...

  7. 面渣逆袭:Redis连环五十二问,图文详解,这下面试稳了!

    大家好,我是老三,面渣逆袭系列继续,这节我们来搞定Redis--不会有人假期玩去了吧?不会吧? 基础 1.说说什么是Redis? Redis是一种基于键值对(key-value)的NoSQL数据库. ...

  8. 【五】将博客从jekyll迁移到了hexo

    本系列有五篇:分别是  [一]Ubuntu14.04+Jekyll+Github Pages搭建静态博客:主要是安装方面  [二]jekyll 的使用 :主要是jekyll的配置  [三]Markdo ...

  9. 如何保证Service在后台不被kill

    如何保证Service在后台不被kill 相信很多Android开发者在面试过程中会经常被问到“如何保证Service在后台不被kill”这个问题,总结了下一些大神给的答案. 引用知乎Android ...

随机推荐

  1. codeforces Registration system

     Registration system A new e-mail service "Berlandesk" is going to be opened in Berland in ...

  2. 在.net2.0中实现Action和Func方法

    由于这两个是在.net3.5中新加入的特性,所以我们需要自己写一下. 格式如下: delegate void Action();        delegate void Action<T, T ...

  3. springmvc maven搭建二之springmvc的security

    上一篇文档初步搭建了一个springmvc的web工程,现在要来实现第二步咯.将登录校验整合到项目中,我用的是spring 3.0.2的版本,所以这里的登录用了security来处理.不多说,上代码. ...

  4. PAT 甲级 1011 World Cup Betting

    https://pintia.cn/problem-sets/994805342720868352/problems/994805504927186944 With the 2010 FIFA Wor ...

  5. 再看数据库——(5)Group By与Order By

    在使用sql语句时,很多人都会分不清order by与group by,其实简单的说: order by -- 排序 group by --分组 1.order by是行的排序,默认为升序. 有两种方 ...

  6. MySQL之优化总结

    http://www.cnblogs.com/benshan/archive/2012/07/27/2612212.html MySQL之优化总结    今天,数据库的操作越来越成为整个应用的性能瓶颈 ...

  7. JS DOM对象与jQuery对象的转换

    JS转jQuery // 直接用$()来包裹 如同$(this) $(document) var jsObj = document.getElementById('test'); var jquery ...

  8. BZOJ1877 [SDOI2009]晨跑 【费用流】

    题目 Elaxia最近迷恋上了空手道,他为自己设定了一套健身计划,比如俯卧撑.仰卧起坐等 等,不过到目前为止,他 坚持下来的只有晨跑. 现在给出一张学校附近的地图,这张地图中包含N个十字路口和M条街道 ...

  9. Codeforces Round #281 (Div. 2) B 模拟

    B. Vasya and Wrestling time limit per test 2 seconds memory limit per test 256 megabytes input stand ...

  10. 10个简化Web开发者工作的HTML5开发工具

    HTML5的到来,改变了设计和开发的工作,完全改变了以前的开发方式. HTML5进行本身就是一个很简单,很快捷的开发技术并且带给开发人员很多不同的工具和功能,使他们的工作变得更加Cool.它的功能非常 ...