我的 C++ 学习历程 之五 指针与引用

指针与引用

 

        所谓指针就是在内存中的地址,它可能是变量的地址,也可能是函数的入口地址.如果指针变量存储的地址是变量的地址,我们称该指针为变量的指针(或变量指针);如果指针变量存储的地址是函数的入口地址,我们称该指针为函数的指针(或函数指针).
   注意:指针变量与变量指针的含义不同:指针变量也简称为指针,是指它是一个变量,且该变量是指针类型的;而变量指针是指它是一个变量,该变量是指针类型的,且它存放另一个变量的地址.
       局部变量等的内存空间是编译器在栈中自动分配的,它的作用域和生存期局限于所定义的程序块中.我们也可以在堆中用new运算符自己申请内存,该内存的生存期由程序员自己控制.指针的一个重要用途就是:可以匿名访问通过new运算符在堆中分配的内存.
一般说来,变量有两种方法访问:直接通过变量名访问或通过指针间接访问.以前我们介绍的程序中,对变量的访问大多是通过变量名访问的,变量也可以通过指针间接访问,即通过变量的指针而找到变量的值,这是我们下面要学习的内容.此外,我们还要学习函数的指针.
   引用为变量提供了一个别名,变量通过引用访问与通过变量名访问是完全等价的.引用提供了与指针相同的能力,但比指针更为直观,更易于理解.
1.1 指针变量的定义
   我们已经知道,指针类型的变量是用来存放内存地址的.定义了指针类型的变量,就可以在该变量中存放其它变量的地址.如果我们将变量v的地址存放在指针变量p中,就可以通过p访问到v,我们也说,指针p指向变量v.指针的定义方法是在它所指的变量的类型后面加一个"*".下面是指针变量定义的例子:
   int *ptr1;
   char *ptr2;
   这个定义说明:ptr1和ptr2均保存变量的地址,且ptr1指向整型变量,ptr2指向字符变量.定义指针变量时应该注意:
   int *ptr1;
   int* ptr1;
是等价的.严格地说,*是属于变量名的.例如:
   int* pa, pb;
pa和pb分别是属于什么类型?pa是一个指向整型变量的指针,而pb是一个整型变量.也就是说:*应该是属于变量名的.根据这个定义,我们可以写出下面的语句:
   pa = & pb;
   这个语句是给指针变量赋值.&称为地址运算符,它是单目运算符,有一个变量作为它的右操作数,其功能是获取变量的地址.该语句执行后,pb的地址就被赋给了pa,即pa指向pb
1.2 指针变量的使用
   假定pa指向pb,下面的表达式:
   *pa
   是获取pa指向的变量,即为pb.*称为间接运算符.它是单目运算符,有一个变量作为它的右操作数,其功能是获取指向变量的值.
   *pa也能作为左值,即给pa指向的内容赋值.例如:
   *pa=10;
在本例中,它与:
   pb=10;
的效果是一样的.
   C++编译器能够检查数据类型,如果把一个变量赋给一个类型不匹配的数据,可能会出现错误,指针也不例外.例如,如果ptr1和ptr2的定义如前,下面的语句就会出现编译错误:
   ptr2=ptr1;
如果我们把ptr1强制转换成char*类型,再赋给ptr2,就可以了:
   ptr2 = (char*) ptr1;
如果指针类型是void*类型,则可以与任意数据类型的匹配.例如7-1:
   void指针在被使用之前,必须转换为正确的类型.例如:
   int i = 99;
   void *vp = &i;
而下面的语句会产生一个编译错误:
   *vp = 3;
   如果我们没有让指针变量赋值,指针指向的内容并没有意义.在C++中,有几个头文件定义了一个常量NULL(它的值为0),表示指针不指向任何内存单元.我们可以把NULL常量赋给任意类型的指针变量,初始化指针变量.例如:
   int *ptr1=NULL;
   char *ptr2=NULL;
   NULL常用于基于指针的数据结构(例如链表)的末尾(参见第八章),处理这样的数据结构通常是用循环语句.遇到NULL指针时,循环停止.
   注意:全局指针变量被自动初始化为NULL,局部指针变量的初值是随机的.我们编程错误常常出现在没有给指针赋初值.未初始化的指针可能是一个非法的地址,导致程序运行时出现"segmentation fault", "bus error", "system error 2" 等错误,而使程序运行终止.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值