当前位置: 首页 > web >正文

指针与引用

一、指针

        指针指向一块内存,它的内容是所指内存的地址。所以说,指针就是地址

1、指针的声明及初始化

       看下例子

int ival = 1024;int *pi = 0;    正确,0表示空地址
int *pi0 = 5;  错误,5是具体数字,不能表示地址
int *pil;   正确,声明,并没有初始化
*pil = 5;  正确,pil地址里的数字是5,*pil指向5,同理*pil = ival是正确的
pil= &ival;   正确,pil就是地址,所以把5的地址赋值给pil是正确的
int *pil = &val;   正确pi = pil;  正确,就是地址之间的赋值
pil = 0;   正确,空地址

*p++     表示先完成取值操作,再对地址执行++操作。是地址的++。*运算符优先级高于++。

(*p)++   表示*p所指向值的自加运算,是值的++


2、void *指针

       任何类型的指针都可以直接赋值给它,无需进行强制类型转换。

        例如:

void *p1;
int *p2;
p1 = p2; 

3、指向指针的指针

        简单的说就是,A指针的地址存在B指针中,则B指针就是指向指针的指针。


4、指针函数与函数指针

4.1、指针函数是指带指针的函数,即本质是一个函数。函数返回类型是某一类型的指针

类型标识符    *函数名(参数表)

      int *f(xy);

        首先它是一个函数,只不过这个函数的返回值是一个地址值。函数返回值必须用同类型的指针变量来接受。

float *fun();
float *p;
p = fun(a);


4.2、函数指针是指向函数的指针变量,即本质是一个指针变量

 int (*f) (int x); /* 声明一个函数指针 */

    指向函数的指针包含了函数的地址,可以通过它来调用函数。声明格式如下:

类型说明符 (*函数名)(参数)


    如果没有圆括号,就变成了一个返回整型指针的函数的原型声明。
       例如:
              void (*fptr)();
    把函数的地址赋值给函数指针,可以采用下面两种形式:
              fptr=&Function;
              fptr=Function;
    取地址运算符&不是必需的,因为单单一个函数标识符就标号表示了它的地址,如果是函数调用,还必须包含一个圆括号括起来

的参数表。

     总结,主要的区别是函数指针是指针变量(必须要用括号括起来),指针函数是函数。


二、引用

     引用就是某一变量(目标)的一个别名,对引用的操作与对变量直接操作完全一样。

     sizeof(引用)得到的是变量的大小。

1、声明及初始化

  引用的声明方法:类型标识符 &引用名=目标变量名;

  【例1】:int a; int &ra=a; //定义引用ra,它是变量a的引用,即别名
  说明:
 (1)&在此不是求地址运算,而是起标识作用。

 (2)类型标识符是指目标变量的类型

 (3)声明引用时,必须同时对其进行初始化。 

 (4)引用声明完毕后,相当于目标变量名有两个名称,即该目标原名称和引用名,且不能再把该引用名作为其他变量名的别名。
      ra=1; 等价于 a=1;

 (5)声明一个引用,不是新定义了一个变量,它只表示该引用名是目标变量名的一个别名,它本身不是一种数据类型,因此引用

         本身不占存储单元,系统也不给引用分配存储单元。故:对引用求地址,就是对目标变量求地址。&ra与&a相等。

 (6)不能建立数组的引用。因为数组是一个由若干个元素所组成的集合,所以无法建立一个数组的别名。


2、引用应用

2.1、引用作为参数
     引用的一个重要作用就是作为函数的参数。以前的C语言中函数参数传递是值传递,如果有大块数据作为参数传递的时候,采用

的方案往往是指针,因为 这样可以避免将整块数据全部压栈,可以提高程序的效率。但是现在(C++中)又增加了一种同样有效率

的选择(在某些特殊情况下又是必须的选择),就是引 用。

{ int p; p=p1; p1=p2; p2=p; }main( )
{int a,b;cin>>a>>b; //输入a,b两变量的值swap(a,b); //直接以变量a和b作为实参调用swap函数cout<<a<< ' ' <<b; //输出结果
}

上述程序运行时,如果输入数据10 20并回车后,则输出结果为20 10。

说明:

(1)传递引用给函数与传递指针的效果是一样的。

(2)使用引用传递函数的参数,在内存中并没有产生实参的副本,它是直接对实参操作。


2.2、常引用
  常引用声明方式:const 类型标识符 &引用名=目标变量名;
  用这种方式声明的引用,不能通过引用对目标变量的值进行修改,从而使引用的目标成为const,达到了引用的安全性。

int a ;
const int &ra=a;
ra=1; //错误
a=1; //正确

2.3、引用作为返回值
  要以引用返回函数值,则函数定义时要按以下格式:
类型标识符 &函数名(形参列表及类型说明)
                    {函数体}
  说明:
  (1)以引用返回函数值,定义函数时需要在函数名前加&。
  (2)用引用返回一个函数值的最大好处是,在内存中不产生被返回值的副本。


3、值传递、指针传递、引用传递

值传递不可以交换参数

指针传递、引用传递可以交换参数。但指针传递是副本传递,浪费内存;引用传递节省内存。

http://www.xdnf.cn/news/11224.html

相关文章:

  • superior哥AI系列第6期:Transformer注意力机制:AI界的“注意力革命“
  • 百度网盘国际版 Dubox 体验:干净好用,却与国内用户无缘
  • ubuntu安装rabbitvcs
  • 如何快速的学习单片机,学习单片机的路线是怎样的??末尾附赠教程+项目资料包
  • 软件研发管理经验总结 - 技术管理
  • IIS 服务器,下载APK 文件,用于发布更新最新的APK包
  • layui框架——弹出层layer
  • JavaScriptAPI编程_History对象(获取浏览历史)
  • 插件与控件的区别
  • Linux多线程(2)-线程间同步的5种方式,一次性说清楚!
  • VMware虚拟机Windows 10安装使用教程(非常详细)从零基础入门到精通,看完这一篇就够了
  • 【Maven入门篇】(3)依赖配置,依赖传递,依赖范围,生命周期
  • 软件版本号扫盲——Beta RC Preview release等
  • latex如何输入正确的 双引号
  • WinForm中常用控件
  • C#中CheckListBox的用法
  • 搭建Serv-U FTP服务器共享文件外网远程访问「无公网IP」
  • 使用CImage类
  • Linux系统 虚拟机安装教程_虚拟机安装linux系统
  • 镜头选型——景深计算
  • 86年版五笔和98年版五笔区别
  • C语言从入门到精通保姆级教程(2021版上)
  • Response.AddHeader使用实例
  • functionexists php,PHP 检测函数是否被定义 function_exists 函数
  • [转载] Rss 与 Feed 的概念区别
  • 正则表达式匹配“不包含某些字符串”的技巧
  • SAPCRM销售订单集成创建
  • C#中Socket的简单使用
  • 注册系统热键 RegisterHotKey()
  • Android中ProgressDialog的使用