“指针”-01

1.指针定义(维基百科):指针是编程语言中的一类数据类型及其对象变量(实体),用来表示或存储一个存储器地址,这个地址值直接指向存在该地址的对象的值。这个对象的值,可能代表另一个变量、结构、对象或函数。在计算机科学中,指针是一种最简单形式的引用(reference)。指针有两种含义,一是作为数据类型,二是作为实体。前者如字符指针、浮点指针等等;后者如指针对象指针变量(为对被引用类型的实体的引用)等。

2.指针的优势:在高级语言中,指针有效的取代了在低级语言(如汇编语言与机器代码)直接使用内存地址。但它可能只适用于合法地址之中。因为指针更贴近硬件,编译器能够很容易的将指针翻译为机器代码,这使指针操作时的负担较少,因此能够提高程序的运作速度;使用指针能够简化数据结构的实现,例如在遍历字符串,查取表格,控制表格及树状结构上。对指针进行复制,之后再解引用指针以取出数据,无论在时间或空间上,都比直接复制及访问数据本身来的经济快速。指针表示法较为直觉,使程序的表达更为简洁,同时也能够提供动态机制来创建新的节点。

3区别:许多编程语言中都支持某种形式的指针,但在使用指针的时候要稍加区别。比如两种典型的语言为代表,分别是面向过程的c语言与面向对象的Java语言:

  • 指针反参考(dereferencing)的动作,可以取出在那个地址中存储的值
  • C++标准中规定,“指针”概念不适用于成员指针(不包含指向静态成员的指针)。C++标准规定,指针分为两类:object pointer type:指向void或对象类型,表示对象在内存中的字节地址或空指针。
    function pointer type:指代一个函数
  • 实质上Java在传递对象的时候用的是按指针(这里认为指针和引用没有本质区别)传递,在传递基本类型(如int)时用的是按值(副本)传递

4.缺点:
  指针本身也存在一些可被滥用之处,在访问某个数据结构时,可能会超出可用范围,使软件或操作系统出现异常,严重时可造成死机。利用指针去访问或修改非合法可取用的数据,也可能造成安全性问题。为此,C与C++语言规定指针类型为强类型,即指针值不仅是一个内存地址,同时它的数据类型说明了存在这个地址可以安全访问的地址的范围。

例如,float* 可以访问4个字节的内存空间,double*可以访问8个字节的内存空间。

由于指针太活跃,因此导致它几乎能不受限制的在各种存储器地址间活动,所以一旦有任何重复、重叠、溢出的情形发生时,计算机便直接死机,这成为指针功能上的最大缺憾。因此在新的网络编程语言的开发上,新的语言如Java、C#等语种已经取消了指针的无限制使用形式。Java中不允许指针或者算术指针的使用。
5.使用指针的目的:
参数传递

  • 指针传递
    在C语言中一般通过传入参数的地址而不是原参数本身来实现。当对传入参数(地址)取“*”运算时,就可以直接在内存中修改,从而改动原想作为传入参数的参数值。
    例如:
#include <stdio.h>

void inc(int *val){
   
    (*val)++;
}

int main(){
   
    int a=3;
    inc(&a);
    printf("%d\n", a);
    return 0;
}

// Output:
// 4
  • 值传递

main()内的变量从来没有改变,改变的只是sw()内的变量。

#include <iostream>
using namespace std;

void sw(int x, int y) {
   
	int Temp;
	Temp = x;
	x = y;
	y = Temp;
}

int main() {
   
	int a=1;
	int b=2;
	cout <<  a << b << endl;
	sw(a,b);
	cout <<  a << b << endl;
	
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值