发布网友 发布时间:2024-09-26 10:14
共1个回答
热心网友 时间:2024-10-04 06:33
你问的这个话题太大。关于指针和引用要讲的东西很多。我的理解:指针:其实指针这个概念在谭浩强的这本书上是这样说的,指针就是地址,指针值就是地址值。指针变量就是存放指针的变量,所以一定不要将指针与指针变量搞混淆了。指针仅仅是一个地址值,而指针变量就是存放指针(也就是地址的变量)指针的定义:例如整型指针:int*p;p是一个指向int类型数据的指针变量。里面存放的地址(也就是指针)是一个int类型变量的地址。指针变量时有类型的,例如p的类型就是int*表示p是一个指向int类型的指针变量。如何知道一个指针变量的类型呢,最简单的方法就是去掉变量定义语句中的变量名,剩下的部分就是其类型,这种方法适用于所有的变量定义,例如inta;a的类型是int。intb[10];b的类型是int[]表示是一个数组(关于数组类型这里不谈,因为这个问题很微妙,其实在c、c++中没有数组类型这个概念,包括函数类型也是一样的),int*c;c的类型是int*。int**d;d的类型就是int**;所以通过这种方法来判断一个变量的类型是很方便的。说道指针变量,我们必须说到得有几个方面。1.指针类型。这个很重要,一个指针是有类型的,也就是一个地址是有类型的。具体说是某一个地址会指向不同类型的数据,这是不一样的,例如int*p;p是指向int型数据。double*p1;p1是指向double型数据。但是p和p1本身在内存中占用的空间是4个字节(对于32位的系统来说),如果是在TC中编译c程序,应该是2个字节了(dos操作系统是16位的)。有人说地址不就是一个值吗,类似于0xfffdddcc这样的地址数值,为什么还分什么类型呢,我要说的是这个关系很大。我们知道指针是有运算的,int*p=&a;那么p++到底加了多少呢,不要以为是将p里面的地址值加了1,这是完全想当然。实际上加了sizeof(int)这么多个字节。也就是说加了一个int元素应该占用的字节,这样在数组中我们可以通过这种方式从上一个元素很方便的让指针变量指向下一个元素。p+5的话实际上是加了p+sizeof(int)*5这么多个字节。另外一点事指针的类型决定了当指针解引用的时候其所以指向的内存单元中的二进制数据如何解释的问题。例如int*p=&a;那么(*p)取得的数字就是一个整型数据,如果(*((char*)p))得到的就是一个字符型数据了。p本来指向的是int型数据(有4个字节)的首地址,如果将其强制转换为一个指向char类型的指针变量,那么在解引用的时候只取第一个字节的数据,并将其解释为一个ascii码代表的字符。还有如果是一个指向函数的指针变量,我们可以通过此指针变量直接调用函数。例如int(*function)(int);此时function指向一个函数,此函数具有一个int参数,返回一个int值。那么通过指针可以这样调用该类型的函数了inta=function(100);或者inta=(*function)(100);其实要不要解引用都是可以的。不过以前是需要解引用的,现在c标准规定这两种方法都可以。总的来说指针的类型很重要。2.指针与数组。我们向一个函数传递数组的时候一般是传递数组名,我们知道数组名是一个代表数组中第一个元素的地址并且数组名是不可以当左值的。其实你又没有想过数组名到底是什么呢。有人说其实数组名就是一个指针常量,是一个不可以改变的指针常量。例如:inta[10]={1,2,3,4,5,6,7,8,9,10};那么a可能的类型是int*consta;注意const的位置(关于指针常量和常量指针,这个以后说),那么这种说法到底对不对呢。我们可以通过sizeof运算符来计算某一种数据类型占用的存储空间。例如sizeof(10)的值为4,注意这里我都假设在32位的操作系统上面编译。其实sizeof(10)和sizeof(int)是一样的,仅仅是求这种类型的数据占用多少内存空间,而不是说具体的某个数据占用的空间,因为对于10这个文字常量来说根本不会占用内存空间的,其实随着程序直接编码到源程序中的,不存在分配内存的问题。那么我们这样计算sizeof(a);是不是如我们所愿得到的是4呢。结果可能会有意外,因为其值是sizeof(int)*10也就是40个字节,显然这个字节数是整个数组占用的字节数。而不是int*类型的指针变量占用的字节数,我们知道一个地址只占用4个字节那么这说明数组名绝对不是简单的int*类型。但是数组确实具有int*的特性。例如int*p=a;这是不会报错的。而且在函数之间传递的时候也是采用这样的方式:voidprint(intb[10]){}调用函数:print(a);或者:print(&a[0]);都是一样的。注意在某一个函数内对形参进行sizeof:voidprint(intc[100]){sizeof(c);//此时表达式的结果是4,而不是100。因为这里intc[100]与int*c是一样的,c不是数组名(数组名是不能作为左值的)}3.指针与函数一个指针可以指向一个函数,指针可以作为函数参数,函数可以返回一个指针类型的数据。指向函数的指针:指向函数的指针,实际上此指针就是函数代码的入口地址。我们可以通过这样的方式调用函数。例如:voidprint1(intx){cout<<"hello"<