指针与引用
指针、引用、指针与引用区别。
变量:代码中常常通过定义变量来申请并命名存储空间,并通过变量的名字来使用这段存储空间。
//变量 int nNum; //声明名字为nNum的int型存储空间 nNum = 100; //nNum存储值100 nNum = 200; //改变nNum存储值200
指针:又叫一级指针,用来指示一个内存地址的变量。对于一个类型T(int、char、folat...),T*就是指向T的指针类型,一个T*类型的变量保存了一个T对象的地址。
//指针 int *pNum; //定义指针pNum pNum = &nNum;//pNum指向变量nNum在内存中的地址,而不是变量本身的值200(取地址运算符&:取变量的地址。如:&nNum为取变量nNum的地址) int nNum1 = *pNum; //取指针pNum指向存储空间值200(指针运算符*:从地址中取数据。如:*pNum为从地址pNum中取值)
指针变量:指针是地址,指针变量是存放地址的变量。
//指针变量 int *pVar = pNum;//等同int *pVar = &nNum;
二级指针:指向指针变量的指针。
//二级指针 int **ppNum = pVar;//
用一张图表示下二级指针:
C是常量;B是一级指针,B的值(即C的地址)是一级指针数据;A是二级指针,A的值(即B的地址)是二级指针数据。
空指针:不指向任何对象,指针变量值为NULL。指针为空的判断常常为了避免指针变量的非法使用。
int *pNum = NULL; ... if(NULL != pNum) { ... }
函数指针:是指向函数的指针变量。可用该指针变量调用函数,就如同用指针变量引用其他类型变量一样。
函数指针声明格式:类型说明符 (*函数名)(参数)
//函数min int min(int x,int y); //函数max int max(int x,int y); //函数指针 int (*pFun)(int, int); //使用函数指针调用函数 int nNumMin = 1; int nNumMax = 100; int nMin = 0; int nMax = 0; pFun = min; nMin = (*pFun)(nNumMin,nNumMax);//nMin = 1; pFun = max; nMax = (*pFun)(nNumMin,nNumMax);//nMax = 100;
指针函数:函数的返回值类型是一个指针类型,本质是一个函数。
指针函数声明格式:类型说明符 *函数名(参数) 或 类型说明符 *(函数名(参数))
int *pfun(int, int);//pfun是一个指向返回值为int的函数的指针
引用:是对象的别名,对引用的操作与对变量的直接操作一样。其主要用于函数参数和返回值类型,T&表示T类型的引用。引用不是数据类型,引用本身不占存储空间。
int i = 100; int &j = i;//&为标识作用,非取地址
1)指针可以指向空值,引用不能。如果一个变量指向另一个对象,它可能为空,应该用指针;它不允许为空,应该使用引用。
2)指针可以改变指向,引用不可以改变指向。引用初始化以后不能被改变,指针可以改变所指的对象。
3)指针的大小是固定字节(4个字节),引用的大小是所指变量的大小。
版权声明: 本博客地址 http://www.cnblogs.com/joinclear,欢迎转载,转载请标明原文作者和链接。
文章说明: 一家之辞难免有误,欢迎您中肯的指正;如对您有帮助,不胜荣幸,但更希望能够抛砖引玉。
- joinclear
答C++复杂多余者之惑
C和C++有太多的历史包袱而其它语言并没有这些,从另一个角度下来讲C和C++其实就是现代语言的活字典,也是现代软件设计的基础,当然有更古老的语言,但像C和C++影响力这么大的却无其它语言可以出其左右。
C++和其它语言最大的不同在于它不属于任何人,任何公司,而Java,C#,Python,Ruby等都是由某个公司或个人控制的,在相对封闭的体系之下设计的语言很容易可以做到易用性,但灵活性和设计思想的广泛度上与C++这样的语言不可同日而语。且不说其它语言从C/C++中借鉴的大量的特性,单就语言本身能够体现的设计思想广泛性上来讲只能说其它语言只作到了”溺水三千 只取一瓢”,像C++可以支持设计风格就有四种:面向过程、基于对象、面向对象、泛型。今日的C++并不是一开始就这样,最初的C++ 中连stl都没有,stl最初是HP内部开发使用的,后来才加入到标准中去,template技术也是后来加入的,反过来stl又引template的出现作了相应修改。由于C++开放的特性,在其被快速、广泛应用的同时,也出现标准落后于编译器实现的情况,因为业界的需求总是先于标准出现的,而商业化的产品必须满足这种需求。比较具体的例子如早期的VC++ ,在其MFC库中加入了很多现在看来冗余的设计比如说List这样的容器,那是不得已而为之,MFC出现的时候C++本身还不够完善,如此VC++本身就有了另一种历史负担,由于Windows平台在国内事实上的统治地位,造就了大批C++开发从VC++开始的进入这个领域的局面,而由于VC++、MFC本身的实现就不够标准,所以在入门的时候就把人引入了歧途,让学C++的根本没搞清楚到底什么是C什么是C++。大多数人从写界面开始,所以MFC的影响很不好,另一个角度来讲Windows本身所提倡的API风格,编码风格(匈牙利命名法)完全自成一体,与Unix-like这种提倡,简洁、明了的设计风格背后的设计哲学完全不同,但现代软件的历史其实是C/C++和Unix历史,所以在没有搞明白这些之前贸然进入Windows开发领域反而给更多的人造成的更多的困惑,我不是说Windows不好,而是想说不懂Linux、Unix、C/C++,那更不可能真正的搞懂Windows。因为操作系统理论上很多东西都是由unix发展过来的。简单如strcpy这样的C函数和StringCopy这样的函数名称在编码的时候有多少在会去思考它背后的东西呢?
C++这样的背景正好和GNU以及互联网的发展过程相切合,从软件工程的角度来讲正如《人月神话》所说,C++实际上和Linux一样,是在一种“大集市”的模式下产生的,从而产生了类似Linux的问题,灵活、强大,但进入的门槛比较高。各种思想在C++ 中全面开花造成C++本身强大的同时复杂度也飙升。但就像Unix-like OS使用一样,他就是面向技术人员的,而且面向的是喜欢技术的人员,如果你是个比较懒的技术人员那么C/C++绝不适合你,因为它在不停的发展,也有浩瀚如海的思想和技巧在里面,不时常的琢磨是绝对用不好的。
C++中异常的处理之所以不如Java这样的语言完善,是因为操作系统的限制,真正的异常处理机制完全是由操作系统提供的,在各种平台的差异下编译器没有办法作到面面俱到,而Java之所以可以做的更好,之是因为有JVM的存在,C++编译器不能代替操作系统的工作,但JVM却可以胜任这个角色。
至于大而全的库,C++发展至念已经有很多不错的库了,比如说boost,poco,正因为很多人没搞清楚c/c++是什么,还在思想的混乱中纠结就更不可能对库有更准确的看法了。如果你真的在使用C++那么学习使用好的库如boost,那么价值远大于去学习另一门语言。