引用和指针的部分总结

     一,   指针

先从变量的地址说起,什么叫变量的地址呢,在C/C++语言中,进行变量说明时,系统将给变量分配对应的存储单元,每个存储单元都有唯一的标明该变量在内存存储位置的首代码,称为变量的即地址(address),用一个十六进制的长整型数表示。

      变量的地址是变量在存储单元中的起始位置的编码,那么我们形象的认为是指向该变量,所以又称为指针。注意:取地址运算符“&”代表的是:如果要获取变量的地址,就用该运算符,格式:&变量名。

      *与&是互逆运算符,为右结合方式运算,就是从右往左运算。

       故而地址值可以存放到变量中,用于存放地址值(指针)的变量称为指针变量。格式:类型  *  指针变量名(类型要与指针变量所指向变量的类型相同)。

       注意:1.同一个指针变量可以指向相同数据类型的不同变量;

             2.使用指针变量间接访问时,指针变量必须指向一个变量后才能对指针变量指向的对象进行操作;

             3.通常情况下,指针变量不要赋值非地址表达式(因为指针变量的运算为内存地址运算,运用不慎可能导致内存泄漏,程序崩溃等情况)

      二.引用

而引用呢,也是一种对变量的间接访问,引用也就是变量的别名,其主要用途为:描述函数的参数和返回值,特别是传递较大的数据变量,引用在使用上往往比指针更安全。定义引用时,系统会自动把变量的地址作为引用的地址,使引用与变量有相同的存储单元,对引用的操作相当于对变量的操作,从而实现对变量的间接访问。与指针相比,引用不占用新的地址,节省内存开销,而且隐去了地址操作,从而封锁了对地址的可修改性,更加安全。注意:与取地址运算符格式不同,引用的格式为      &引用名=变量名(间接获取变量名),取地址是      &变量名(直接获取的变量名)。在引用中,&为引用定义符。

三,指针的运算

先举个栗子:

#include <iostream>

using namespace std;

void main()

int *p=(int*)0xf40;//将十六进制数转换为地址值                             后赋值给指针变量p

cout<<p<<endl;

p=p+4;//p向内存值增加的方向移动4个整型存储单元

cout<<p<<endl;

}

运行一下,得到结果:

0x00000F40

0x00000F50

(即十六进一)。

综上:假定p为指针变量,n为整数,则表达式“p+(-)n”所得到的地址值为:p的原地址值+(-)k.n(k为与p类型相同的存储单元的字节数)

两指针相减:结果为两个指针之间的存储单元个数。
指针的自增自减要注意:(*p)++与++(*p)不是指针的增量运算,而是表示指针变量所指向的存储单元增值1。
另外:*(p++)表示先获取p所指向的存储单元的值,再指向下一个存储单元;
         *(++p)表示p先指向下一个存储单元,再获取所指向的存储单元的值。

四,指针与函数

    C++中,函数之间的数据传递主要有值传递和地址传递方式,地址传递方式又分为指针方式和引用方式。

    当我们开始在不同函数之间传递大量数据时,为了提高效率,减小程序开销,可以采用只传递数据的首地址,而不用传递数据的值(此方法传递的数据是需要存放在一个连续的内存区域中,比如数组)。

   (以指针作为函数参数) 如果以指针作为函数的形参,在调用时实参将值传递给形参,也就是使实参和形参指针变量指向同一内存地址,因此在子函数运行时,通过形参指针对数据值的改变也同样影响着实参所指向的数据值,从而实现参数双向传递的目的。

    (指针函数)目的:要在函数调用结束时把大量数据从被调用函数返回到主调函数中,而通常非指针型函数在调用结束后只能返回一个值。注意:在调用指针函数时,需要一个同类型的指针变量接受返回的值。格式如下:

数据类型  * 函数名(参数表)

定义:当一个函数声明其返回值为指针类型时,这个函数就称为指针型函数。

  (指向函数的指针):调用函数时,编译系统是根据函数名找到函数代码的首地址,从而执行这段代码,其实,函数名就是该函数的代码在内存中的起始地址。函数指针是指向某个函数的指针,用于存放该函数代码首地址的指针变量,可以像使用函数名一样通过指向该函数的指针来调用该函数。格式如下:

数据类型 (*函数指针名)(形参表);

五,指针常量与常量指针

      1.指针常量即就是指针值不能被修改的指针,

格式如下:

        数据类型  *  const 指针名 =变量名;         注意:定义时要出初值,指针的值不允许修改;而指针所指向的对象的值可以被修改。

   int a=1;

   int b=2;

   int * const p=&a;

    p=NULL;//错误

           *p=b;//正确


2,常量指针

       即指向常量的指针变量,格式如下:
  const 数据类型 * 指针变量=变量名;
         注意:指针指向的对象的值不能被更改,但指针本身可以改变,指向另外的对象,与指针常量相反;
                   可以将非常量指针赋给一个常量指针,但不能将一个常量指针赋给一个非常量指针,因为const修饰的是指针指向的内容而不是指针的值(地址值)。


3.     指向常量的指针常量(简称常指针常量)

             格式如下:
const   数据类型 *const 指针变量=变量名;
     通常作为函数形参,以防止函数体内通过形参修改实参所指向的值,以保护实参。
    


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值