zoukankan      html  css  js  c++  java
  • 指针和引用的比較

    一 Reference 和指针的差别

    尽管使用引用(reference)和指针都可间接訪问还有一个值,但它们之间有两个重要差别。第一个差别在于引用总是指向某个对象:定义引用时没有初始化是错误的。第二个重要差别则是赋值行为的差异:给引用赋值改动的是该引用所关联的对象的值,而并非使引用与还有一个对象关联。

    引用一经初始化,就始终指向同一个特定对象(这就是为什么引用必须在定义时初始化的原因)。 考虑下面两个程序段。

    第一个程序段将一个指针赋给还有一指针: 

     int ival = 1024, ival2 = 2048; 
     int *pi = &ival, *pi2 = &ival2; 
     pi = pi2; // pi now points to ival2 

    赋值结束后,pi 所指向的 ival 对象值保持不变。赋值操作改动了 pi 指针的值,使其指向还有一个不同的对象。

    如今考虑还有一段相似的程序,使用两个引用赋值: 
     

    int &ri = ival, &ri2 = ival2; 
    ri = ri2; // assigns ival2 to ival 

    这个赋值操作改动了 ri 引用的值 ival 对象。而并不是引用本身。赋值后,这两个引用还是分别指向原来关联的对象,此时这两个对象的值相等。 


    int *ip[4];    // array of pointers to int
    int (*ip)[4];  // pointer to an array of 4 ints


    三 typedef 简化指向多维数组的指针

    typedef 类型定义可使指向多维数组元素的指针更easy读、写和理解。

    下面程序用 typedef 为 ia 的元素类型定义新的类型名: 

    int ia[3][4]; // array of size 3, each element is an array of ints of size 4 
    int (*ip)[4] = ia; // ip points to an array of 4 ints 
    ip = &ia[2]; // ia[2] is an array of 4 ints
    
    typedef int int_array[4]; 
    int_array *ip = ia; 
    
    可使用 typedef 类型输出 ia 的元素: 
     for (int_array *p = ia; p != ia + 3; ++p) 
       for (int *q = *p; q != *p + 4; ++q) 
         cout << *q << endl; 
    外层的 for 循环首先初始化 p 指向 ia 的第一个内部数组,然后一直循环到 ia 的三行数据都处理完为止。

    ++p 使 p 加 1,等效于移动指针使其指向 ia 的下一行(比如:下一个元素)。 

  • 相关阅读:
    MySQL 5.7笔记
    Golang学习笔记
    Ubuntu使用笔记
    Linux下安装nginx和php
    Eclipse远程调试Java程序
    CentOS下glibc更新
    Linux服务器运行环境搭建(三)——MySQL数据库安装
    Linux服务器运行环境搭建(二)——Redis数据库安装
    Linux下定时任务Crontab的使用
    Linux下nginx安装与配置
  • 原文地址:https://www.cnblogs.com/llguanli/p/8310244.html
Copyright © 2011-2022 走看看