学习C++ -> 引用( References )

本文详细介绍了 C++ 中的引用概念,包括引用的基本定义、声明方式及其与指针的区别。并通过实例展示了如何使用引用进行变量值的输入与输出,以及如何对指针和无名实体建立引用。

学习C++ -> 引用( References )




一、引用的介绍
    引用就是某一变量(目标)的一个别名, 相当于同一个人有了两个名字, 无论喊哪一个名字实际上都是指的同一个人。 同样, 在引用上, 对引用的操作与对变量直接操作的效果完全一样, 因此, 修改引用的值就是在修改变量的值。
    
    从内存角度来说, 引用与变量名指向的都是同一处内存, 对引用地址的操作与对变量名地址的操作都是对同一处内存进行操作。 引用本身占用存储单元, 但是你没有办法从C++层面去访问到引用所占用的空间。
    

 


    
二、引用的声明
    引用的声明方式与指针类似, 其形式如下:
        类型标识符&引用名 = 初始值 ;
    & 为引用说明符, 表示该数据类型为引用类型。例如:

        int n = 10 ;
          int &rn = n ;        //建立变量int型变量n的引用rn
        
        float f ;            //建立float型变量f的引用rf
        float &rf = f ;

  
    在声明一个引用时必须对引用进行初始化, 因为引用一经声明便无法修改, 不能声明一个未初始化的引用。例如:

        int &rn ;        //错, 未初始化

       
    其次, 声明语句中的类型必须与初始值的变量类型一致, 像下面这样使用就是错误的:

        int n = 10 ;
          double &rn = n ;        //错, 声明的引用类型为double, 而初始值的类型为int

 

 
       
        
三、引用使用初步
    1>. 例: 使用引用进行值的输入与输出:
    

按 Ctrl+C 复制代码
按 Ctrl+C 复制代码

    输出:

    100                ↙键盘输入
    n=100, rn=100

    Process returned 0 (0x0)   execution time : 2.094 s
    Press any key to continue.


    在该程序中, 首先建立n的引用rn, 再通过引用rn对n的值进行赋值, 准确来说是通过rn对他们所指向的内存单元进行数据的写入。从输入以及输出结果来看, n与rn的值都是100, 也就再一次证明了对引用的任何操作都等价于对目标变量的操作。

    2>. 建立指针的引用
        对指针建立引用是合法的, 如:

            int n = 10 ;
               int *pn = &n ;      //指向变量n的指针
            int * &rpn = pn;    //建立指针的引用

           
        在建立指针的引用时需要注意 * 号与 & 符号的位置问题,int * &rpn = pn; *号在前, 这样是正确的; 如果把 * 号放在 & 符号后( int & *rpn = pn; ) 这样就是错误的, 编译器会报错。
        
        
    3>. 对无名实体建立引用
        C++允许对用new开辟的无名内存建立引用, 如:

            int &r = *new int ;

        在销毁所开辟的内存时, 可以使用delete &r; 进行实现。
        
        

 


四、引用使用的一些限制
    1>. 不能建立数组的引用

        数组是由若干个元素组成的集合, 所以无法建立一个数组的别名。 从内存角度来说, 数组名只是代表一个内存单元的地址, 而引用需要的是一个内存单元的实体, 也就是说一次最多只能对该数组中的一个元素建立引用, 如:

            int a[5] = {0} ;
            
               //对数组名建立引用
            int &r = a ;          //错误, a不是实体
            
               //对数组元素建立引用
            int &r = a[2] ;        //正确

           
            
    2>. 不能建立引用的引用
        一个变量可以有多个引用, 但C++规定不能对引用再建立引用:

            int & &rr = r ;        //错误, 不能建立引用的引用

 


           

            
五、指针与引用的比较
    不同点:
        1>. 指针可以被重新赋值, 而引用一经声明初始化便无法修改 ;
        2>. 指针可以为空(NULL), 而引用不能 ;
        3>. 指针在声明时可以不进行初始化, 而引用不能 ;
    相同点:
        都能直接对实体进行操作。
        
    一般来说, 引用能做到的事指针都能做到, 但指针威力较大, 在使用不当的情况下指针错误通过会造成十分严重的后果, 风险较高。而引用则相对安全, 并且引用不会使用额外的存储单元。因此正确的使用引用可以提高代码变的健壮性, 使程序更高效的运行。

#include <stdio.h> #include <stdlib.h> #include <dos.h> #include <conio.h> int main(void) { union REGS inregs, outregs; struct SREGS segs; int i, j; int structure_size; struct SystemTableEntry { struct SystemTableEntry far *next; /*Next SFT entry*/ unsigned file_count; /*Files in table*/ unsigned handle_count; /*Handles to this file*/ unsigned open_mode; /*File open mode*/ char file_attribute; /*Attribute byte*/ unsigned local_remote; /*Bit 15 set means remote*/ unsigned far *DPD; /*Drive parameter block*/ unsigned starting_cluster; unsigned time_stamp; unsigned date_stamp; long file_size; long current_offset; unsigned relative_cluster; long directory_sector_number; char directory_entry_offset; char filename_ext[11]; /*No period, space padded*/ /*Ignore SHARE fields for example*/ } far *table_ptr, far *file; long far *system_table; /*Get DOS version*/ inregs.x.ax = 0x3001; intdos (&inregs, &outregs); if (outregs.h.al < 3) { printf("This program requires DOS version 3 or later\n"); exit (1); } else if (outregs.h.al == 3) structure_size = 0x35; else if (outregs.h.al >= 4) structure_size = 0x3B; /*Get the list of losts pointer*/ inregs.h.ah = 0x52; intdosx (&inregs, &outregs, &segs); /*The pointer to the system file table is at offset 4*/ system_table = MK_FP(segs.es, outregs.x.bx + 4); table_ptr = (struct SystemTableEntry far *) *system_table; do { printf("%d entries in table\n", table_ptr->file_count); for (i = 0; i < table_ptr->file_count; i++) { file = MK_FP(FP_SEG(table_ptr), FP_OFF(table_ptr) + (i * structure_size)); if (file->handle_count) { for (j = 0; j < 8; j++) if (file->filename_ext[j] != ' ') putchar(file->filename_ext[j]); else break; if (file->filename_ext[8] != ' ') putchar('.'); for (j = 8; j < 11; j++) if (file->filename_ext[j] != ' ') putchar(file->filename_ext[j]); printf (" %ld bytes %x attribute %d references\n", file->file_size, file->file_attribute, file->handle_count); } } table_ptr = table_ptr->next; } while (FP_OFF(table_ptr) != 0xFFFF); printf(" Press any key to quit..."); getch(); return; }  修改其中的错误,使其运行
最新发布
11-22
### 关于编程或技术上下文中引用的重要性 在编程和技术领域中,引用不仅用于学术研究中的文献追踪,还广泛应用于代码库管理、文档编写以及软件开发的最佳实践分享。例如,在讨论 SATD(Technical Debt)检测方法时提到 ELMo 技术的表现表明动态词嵌入相较于静态词嵌入具有更高的可靠性[^1]。 对于 C++ 这样的复杂语言而言,许多技术细节被整理至附录或者专门的手册之中以便开发者查阅[^2]。这种做法有助于保持主要文档的简洁性和可读性,同时也确保了所有必要信息能够方便地找到。 当设计提示语 (prompts) 或者创建技术文档时,采用一系列策略可以提高沟通效率并减少误解风险。其中包括但不限于使用简单明了的语言给出精确指导;利用结构化形式展示内容比如列表项;定义输出的具体样式等等[^3]。 从认知科学角度来看,具身认知理论为机器思维提供了更为全面且灵活的框架模型,不过要完全实现该理念仍需克服一些技术障碍[^4]。而在大规模数据集方面,则有像 Pile 和 ROOTS 这样包含了多种自然语言及程序设计语言的大规模集合可供选择[^5]。 综上所述,在任何涉及技术创新的工作流程里,“reference”都扮演着不可或缺的角色——无论是作为知识传播媒介还是质量控制工具。 ```python def find_references_in_code(file_path): with open(file_path, 'r') as file: content = file.read() references = re.findall(r'\b(reference|referenced?|cited?)\b', content.lower()) return len(references) print(find_references_in_code('example.cpp')) ``` 此函数可用于统计给定文件内的参考次数。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值