《指针和引用小结》

来源:互联网 发布:中昌数据股票 编辑:程序博客网 时间:2024/05/22 09:48

指针和引用小结

 

对于指针,学C的时候以为自己理解了。最近看C++书才发现还有好多东西要学。由于C++引入了“引用”概念,这次就把自己的理解和书上的东西做一个小结。

对于指针,这是C语言中的一个重要的概念。

一、         什么是指针?

指针是一种特殊的变量,它具有名字、类型、值。它和一般变量的区别在于值和类型上。

二、         变量在内存中的表示。

变量被定义后,在内存中占用一块空间。这个空间有两个值:变量的值和变量的地址。

指针变量存储的是地址。这是指针存在的意义。就好像人活着总要意味着什么。指针的存在有它存在的必要性。

三、指针简单运用

     指针的运用主要涉及到两个一元运算符:*和&。“*”的作用是取指针所指向变量的具体值,“&”用于取变量的地址(注意:区别于引用的“&”)。

     指针一旦定义,如果值不再改变。例如:intb; int* a = b; 那么,对于b的操作完全可以用*a来代替。因为*a和b是等价的,它们都代表着同一块内存的值。

      (注:指针的定义推荐用:类型* 变量(例如:int* a;)格式,而不用:int*a。因为推荐格式更能体现指针的类型)

 

四、区别:指针数组 和指向一维数组的指针

     先看一下二者的定义格式:

指针数组:         int* a[10]; //数组a有十个元素,每个元素都是指向整形变量的指针

指向一维数组的指针:int (*p)[5];//p是一个二级指针,指向一个具有五个元素的一维数组

     这里重点讨论“指向一维数组的指针”。

     指向一位数组的指针是一个二级指针,常用它来指向二维数组中的某一行。(二维数组的行数就是一个一维数组)

      它的定义和运用:

             Int a[10][5], (*p)[5];

             P = a;//p指向二维数组的第0行

             P = a+1;// p指向二维数组的第1行

             ……

             以此类推。

c/c++不支持将二维数组名直接赋值给一个通过int** p;形式定义的二级指针。如果想用指针操作数组只能定义一个指向数组的指针。

与此类似,还有指向函数的指针和指针函数。

五、数组名

其实,数组名本身就是一个地址。书上说“数组名是一个常量指针”,但是我个人更倾向于“数组名是地指”的说法。经测试,对于数组a[10][10],  a和&a 按%x输出,其值是一样的。同理,a+1和a[1]和*(a+1)的值是一样的,它们都表示数组第1行元素的首地址。

同时,将数组名作为地址来理解,我觉得更方便分析问题。

六、引用

首先,要清除的理解什么是引用。

简单的说,引用就是某个变量或者对象的别名。引用不是变量或者对象,引用不占用内存空间。要牢记“引用就是某个变量或者对象的别名”这一概念。因此。引用的地址就是被引用的变量或对象的地址,引用的值,就是被引用的变量或对象的值,引用的类型,就是被引用的变量或对象类型。再次废话,引用就是给变量或对象改了个名字。(这一点类似于typedef。不过ty[edef是给类型改名字,引用是给变量或类改名字。嗯……,我是这么认为的)

引用的操作完全类似于指针的操作(废话!要不怎么都放在一章讲呢?,自嘲……),但是有几点需要注意:

1、指针式变量,但是引用不是变量。(引用就是某个变量或者对象的别名,牢记啊!)

2、指针可以引用,但引用不可引用。

Eg:int* p; int*& pp = p; 这样定义后就相当于给指针p又起了一个名字,那么今后p就等价于pp了,除了名字不同,其它都一样。如果:int a = 10; pp = &m; 那么pp == p == 10。

3、指针可以作为数组元素,但引用不可以。

例如:int* a[10];是合法的,但int& b[10];不成立。

4、指针可以赋值为空,但是引用不可以。所以,一般都要求引用必须被初始化。

 

说了这么多引用的坏话,该说点好的了。其实,C++之所以引入引用,是有它的道理的(好吧,我承认有又是废话)。引用作为函数参数时,用起来要比指针更加简洁方便。毕竟只是改了个名字而已,又不需要像指针一样开辟空间,但是同样能够达到指针的效果。大家都知道,用指针操作时,有时会存在很大的风险,而引用就相对安全一些。(又是一年三月三,指针飞满天,好可怕呀!好可怕!)

 

暂时就这么多了,贴上来就是希望能与大家交流,若有不足之处,望请大家批评指正!

原创粉丝点击