6个回答
展开全部
咳咳,因为二楼 半季流年 扯蛋得太离谱,所以还是过来回答一下好了……
指针是引用操作的一种实现——这里引用操作的含义是,通过某种间接的手段,能够在某个位置找到某个实体的存在。首先,指针是一种对象(广义而言一元&表达式的结果都是指针,不一定是对象,这种指针概念——是由于&操作符的存在而不可避免地同时存在的;以下仅讨论狭义的指针),它同时可以关联到被指向的对象,那么可以通过指针表示被指对象的存在,从而间接操作这个对象。间接操作相对于直接操作并没有直接的好处,但是指针作为一个对象,本身是一个整数,对指针的复制等操作可以比直接复制被指对象效率提升许多倍。对于排序等需要对象本身进行移动(复制到另外的存储器空间)的操作,指针间接操作没有什么优势;但是如果只是需要引用(让编译器知道在哪里存在)这个对象,那么使用指针就可能有很大优势——例如函数调用按值传递参数会复制实际参数为形式参数,如果复制的对象很大,那么效率会很低,用指针可以大大提升性能。其次,作为对象,指针可以是变量,一个指针在它的生存期可以不只代表一个被指向的对象,而是通过把一元&表达式赋值给指针对象,可以让指针在不同场合指向不同的对象,以便灵活地使用。
C++里引入的“引用”是对象的别名,从实现上来说可以被认为一种操作受限的特殊指针。首先,它是常量,初始化后无法改变它代表的对象;其次,它是(相对一般意义指针而言)类型安全的。由于&之类的操作符作用于引用也被编译器当成作用于被指的对象,因此引用不是对象,而只能被定义为被引用对象的“别名”。这样地把对引用本身的操作被编译器映射到被引用对象的操作,更明确地表达了“引用”的含义。事实上指针底层和指针一般使用相同的实现,对编译器而言一个引用还是一个对象(整数),尽管可能被优化掉导致在目标代码中不存在这个对象,但对于指针也是如此。引用具有类似指针的在参数传递等场合使用下效率上的优势,同时更安全,但它不是对象,更不是变量,因此无法完全取代指针的地位(不过一般而言,没有什么特殊需要,确实应该尽量使用引用代替指针)。另外,C++中可以自行封装语言的内置指针(raw pointer)对象成一个类,定义和指针类似的操作,但禁止另外一些操作(如指针算术)以免误用(还可以加入引用计数等功能,称为智能指针),代替内置指针来使用;这样的类可以称为指针类,它的实例有时候也称为指针。
以下是题外话:
Java和C#等语言为了“简化”复杂的概念,故意回避“指针”一词,而是借用了C++“引用”。但这里的引用和C++中的有很大差别,倒是和指针比较类似(并且实际上一般采用引用计数),可以是变量。引用指向某一个具体的对象,但是对对象无法进行直接操作,所有需要对对象的操作都由指向对象的引用来代理,这样可以把引用和对象视为一体(和C++的引用又有点像)。这样的设计有好处也有坏处:好处是表面上的学习和使用简单了,没有指针概念的历史包袱(“指针”这个一词的含义在许多场合一直都不太容易被弄清楚,可以指一个指针对象、指针类型以及一元&表达式的结果,以及某一个特定场合下人为附加引用语义的整数——且不仅限于C/C++这样的算法语言,甚至在讨论计算机组成原理和汇编语言都可能用到这个词);坏处是直接无视了引用(操作或映射关系)这种实际存在的语义,在对涉及它的行为的理解上带来困难。例如String类的对象(映像,或者实例本身,而不是语言中出现有名称的引用),如果学好C/C++的指针的话相对容易理解,所谓的引用和对象(实例)根本不是一回事。由于只能使用引用来操作对象,没有对对象本身操作的语法,语言本身的表达能力有所削弱,例如不能通过==而必须额外使用equals方法来表达相等关系(==只是表示引用是否指向同一对象的实例),而在C++可以通过不使用指针/引用而是对对象(实例)直接用operator==这种更加自然的用法;结果是,Java/C#在这方面的限制使这类实际要解决的问题并没有简化,手段反而复杂化了。此外,Java/C#借助运行时环境(JVM或CLR)的支持,使用垃圾收集器(GC)而不是C++的确定性析构+资源获得即初始化(RAII)进行安全的对象构造和资源管理,用户对此编写的源代码可以比较简洁,但性能上有明显劣势。事实上,C++可以在语言/源代码层次上可以自行实现GC(只是一般没必要实现通用GC,因此标准库也不包含)——这点再次体现了语言特性导致的表达能力的差异。
====
[原创回答团]
指针是引用操作的一种实现——这里引用操作的含义是,通过某种间接的手段,能够在某个位置找到某个实体的存在。首先,指针是一种对象(广义而言一元&表达式的结果都是指针,不一定是对象,这种指针概念——是由于&操作符的存在而不可避免地同时存在的;以下仅讨论狭义的指针),它同时可以关联到被指向的对象,那么可以通过指针表示被指对象的存在,从而间接操作这个对象。间接操作相对于直接操作并没有直接的好处,但是指针作为一个对象,本身是一个整数,对指针的复制等操作可以比直接复制被指对象效率提升许多倍。对于排序等需要对象本身进行移动(复制到另外的存储器空间)的操作,指针间接操作没有什么优势;但是如果只是需要引用(让编译器知道在哪里存在)这个对象,那么使用指针就可能有很大优势——例如函数调用按值传递参数会复制实际参数为形式参数,如果复制的对象很大,那么效率会很低,用指针可以大大提升性能。其次,作为对象,指针可以是变量,一个指针在它的生存期可以不只代表一个被指向的对象,而是通过把一元&表达式赋值给指针对象,可以让指针在不同场合指向不同的对象,以便灵活地使用。
C++里引入的“引用”是对象的别名,从实现上来说可以被认为一种操作受限的特殊指针。首先,它是常量,初始化后无法改变它代表的对象;其次,它是(相对一般意义指针而言)类型安全的。由于&之类的操作符作用于引用也被编译器当成作用于被指的对象,因此引用不是对象,而只能被定义为被引用对象的“别名”。这样地把对引用本身的操作被编译器映射到被引用对象的操作,更明确地表达了“引用”的含义。事实上指针底层和指针一般使用相同的实现,对编译器而言一个引用还是一个对象(整数),尽管可能被优化掉导致在目标代码中不存在这个对象,但对于指针也是如此。引用具有类似指针的在参数传递等场合使用下效率上的优势,同时更安全,但它不是对象,更不是变量,因此无法完全取代指针的地位(不过一般而言,没有什么特殊需要,确实应该尽量使用引用代替指针)。另外,C++中可以自行封装语言的内置指针(raw pointer)对象成一个类,定义和指针类似的操作,但禁止另外一些操作(如指针算术)以免误用(还可以加入引用计数等功能,称为智能指针),代替内置指针来使用;这样的类可以称为指针类,它的实例有时候也称为指针。
以下是题外话:
Java和C#等语言为了“简化”复杂的概念,故意回避“指针”一词,而是借用了C++“引用”。但这里的引用和C++中的有很大差别,倒是和指针比较类似(并且实际上一般采用引用计数),可以是变量。引用指向某一个具体的对象,但是对对象无法进行直接操作,所有需要对对象的操作都由指向对象的引用来代理,这样可以把引用和对象视为一体(和C++的引用又有点像)。这样的设计有好处也有坏处:好处是表面上的学习和使用简单了,没有指针概念的历史包袱(“指针”这个一词的含义在许多场合一直都不太容易被弄清楚,可以指一个指针对象、指针类型以及一元&表达式的结果,以及某一个特定场合下人为附加引用语义的整数——且不仅限于C/C++这样的算法语言,甚至在讨论计算机组成原理和汇编语言都可能用到这个词);坏处是直接无视了引用(操作或映射关系)这种实际存在的语义,在对涉及它的行为的理解上带来困难。例如String类的对象(映像,或者实例本身,而不是语言中出现有名称的引用),如果学好C/C++的指针的话相对容易理解,所谓的引用和对象(实例)根本不是一回事。由于只能使用引用来操作对象,没有对对象本身操作的语法,语言本身的表达能力有所削弱,例如不能通过==而必须额外使用equals方法来表达相等关系(==只是表示引用是否指向同一对象的实例),而在C++可以通过不使用指针/引用而是对对象(实例)直接用operator==这种更加自然的用法;结果是,Java/C#在这方面的限制使这类实际要解决的问题并没有简化,手段反而复杂化了。此外,Java/C#借助运行时环境(JVM或CLR)的支持,使用垃圾收集器(GC)而不是C++的确定性析构+资源获得即初始化(RAII)进行安全的对象构造和资源管理,用户对此编写的源代码可以比较简洁,但性能上有明显劣势。事实上,C++可以在语言/源代码层次上可以自行实现GC(只是一般没必要实现通用GC,因此标准库也不包含)——这点再次体现了语言特性导致的表达能力的差异。
====
[原创回答团]
参考资料: 原创
展开全部
其实在C++中指针就没有像在C中那么大的用处了,有时候反倒成了累赘了,因为C++中有了一个新的操作符---引用,它不仅能实现指针的功能,而且还比指针好用的多,指针需要分配空间,用完还需要释放内存,引用就不需要。想Java这样的高级语言直接就把指针删了,所以如果你想学高级语言编程的话,掌握指针有好处,不掌握也没坏处,就这样,你自己拿捏吧
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
刚开始学吧?
class 还没有学吧?
不要着急,继续往后看,你就会明白的。可以把你遇到的问题及下来,回头再思考。
class 还没有学吧?
不要着急,继续往后看,你就会明白的。可以把你遇到的问题及下来,回头再思考。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
指针就像是锤子,在李元霸手里就是杀人如麻的利器,在一般人手里就只能砸死自己
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
个人觉得C++一定要学会用类和其中的很多库,模板的;其实C++中提倡能用引用则用引用,实在不行,再用指针
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
膜拜 二楼...
神一样的存在
神一样的存在
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询