当前位置:C++技术网 > 资讯 > 关于指针的9个必须弄懂的问题

关于指针的9个必须弄懂的问题

更新时间:2015-06-23 12:11:15浏览次数:1+次

1.常量指针和指针常量的区别以及用法 

    常量指针:本质是一个指针。常量指针就是指向常量的指针。而“指向”就是所谓的地址,因为地址才能表现指向这一概念。这表明,该指针的值存储的是一个地址,而这个地址就是被指向的常量的地址。因为是常量,所以它的值是不可修改的,因此用*号对指针不能进行赋值操作。当然,这个指针是变量,还可以指向其他的常量,但是这个指针只能指向常量,即存储的值只能是常量的地址而不能是变量的地址。
    指针常量:本质是一个指针。指针常量就是说指针本身就是一个常量,正如整型常量一样。那么作为常量,那么这个指针的值是无法改变的,就相当于一个整型常量一样,一旦初始化后就不可以改变。所以指针常量声明时必须初始化。初始化后这个指针就一直指向这个变量,可以通过*改变被指向变量的值。

2.指针和地址的区别 

    本质:地址是系统的用户地址空间的虚拟内存地址编号,并不是实际的内存地址编号。地址就是一个编号而已,就像门牌号,学号。这没有所谓的存储空间的说法,就是名字。而我们编程使用的地址是虚拟内存地址,就是我们常说的内存地址。而指针,是一个变量,使用变量时需要系统分配一个内存才能使用。而指针是存储内存地址的一种变量,使用指针就像使用内存地址一样。而对指针的赋值只是改变指针变量存储的值,只是更新了一下变量中存储的值而已。
    区别:指针是一个存储地址的变量,占用内存空间,地址只是一串数字,不占内存空间。
    联系:地址是放在指针变量中的。好比 int  a=3;中,a(类似于指针)和3(类似于地址)的关系。

3.变量和地址的联系

变量占内存空间,地址只是一串数字;每一个变量都有地址,可以通过 &变量名  取得变量的地址,就像每一个人都有一个住址一样的。

4.指向指针的指针和指向常量的指针

指向指针的指针:本质是一个指针,只是这个指针指向的变量是一个指针类型的;
也叫二级指针。定义:int **p1;
指向常量的指针:本质是一个指针,该指针只能指向常量,定义 int const *p 或者 const int * p ;

5.指针数组和指向数组的指针的区别以及用法

指针数组:本质是一个数组,只是数组中的每一个元素都是指针。int * a[10];
int  b;   a[0]=&b;
指向数组的指针:本质是一个指针,前面是定语,是修饰语,该指针指向一个数组
。int a[10];  int * pa = a;  或者 int (*a)[10] 这个理解为:用括号括起来的*a使得*首先与a结合,表明a是一个指针,[]表明是一个数组,int 表明这个数组中的元素都是整型的。整体理解就是: 声明一个指向含10个整型元素的数组的指针。
指针和引用的区别以及用法
指针:指向某一个变量,可以改变指向
引用:给变量取别名,取外号,一旦引用,不可以修改。对引用的赋值就相当于对被引用的变量的赋值,因为引用之后,引用和变量就是同一个东西了。

6.数组名和指针

数组名:存放数组中首个元素的地址的常量,是地址常量,内容不可以修改,相当于一个 地址常量。
指针:地址变量,内容可以修改。

7.内存泄露

     在编程中根据需要会动态分配一块内存,这块内存如果没有释放,其他任何程序都不能使用。程序结束,程序占用的资源销毁,如果程序没有释放这块内存,那么这块内存就会因为程序的结束而失去和操作系统的联系,导致这块内存无法再次使用。如果泄露的内存过多,导致可用内存越来越少,最后甚至系统所需的内存都不能满足,系统就崩溃了。重启机器后就会正常。因为重启机器后启动系统会重新规划内存,重新分配。

8.动态内存分配和回收

:栈是一个先进先出的内存结构模型。系统为程序分配内存空间时,都是按照栈的方式进行分配的。因此在程序中出现的函数调用,就是利用栈的特性实现的,这个特性在递归身上表现的淋漓尽致。函数调用时首先将本函数的所有东西压入到栈中,然后执行新函数。执行新函数时将新函数用到的所有东西压入栈顶,使用时出栈即可。执行完后,新函数中所有的东西都出栈了,再出栈就回到了原来函数的执行了。这就是巧妙的利用了栈的特性。程序中自动变量的分配(如 int a ;)就是通过栈来分配的,因而执行完程序之后,这些变量所占的内存自然而然的就释放掉了。
:堆就是一块大内存块。这个内存块是在程序所在的内存块之外的。所有程序都可以在这个堆中请求分配内存。请求成功就用一个指针指向这个请求到的内存,就可以使用了。因为这部分的内存不属于某个程序,实际上是属于系统的,相当于一个公共内存区,对于所有的程序都是可用的。当然,对于这部分的内存的管理,谁申请了就由谁来管理已分配的内存。释放掉之后就由系统来管理,未释放则一直由申请的程序进行管理和使用。如果程序运行结束后忘了释放这块内存,因而在堆中系统还是认为这块内存已经被分配,所以其他程序也就无法申请使用,而这个程序又结束了,这样一来,这块内存就谁也不可用了。这就是内存泄露。久而久之,这样的内存越来越多,那么堆中的内存就少了,自然系统就到空余的内存获取来补充堆内存的数量。然而,泄露的一直持续的话,所有的可用内存都用来做堆内存了,而对内存一直在泄露最后,堆中无可用内存,所有程序就无法请求动态分配内存了。同时此时,系统也无法请求内存,然而系统核心程序运行请求不到内存就失败,这样整个系统就运行不了了,就崩溃了。重启系统后,内存中的数据全部清零,全部重新规划,就不存在这个内存不足的问题了。但是如果还运行这些不完善的程序,还会内存泄露。堆的作用主要就是为程序提供动态内存分配,这样就能满足程序运行时增加内存的要求。
    程序的代码一般是在栈中的,使用动态内存分配,会给程序在内存的堆(一块特定的内存区域)中分配一块内存,利用这个动态分配函数分配的内存,在使用完后必须使用对应的函数释放相应的内存,不然就会造成内存泄露。

9.C++ 中this指针
    this指针是面向对象才出现的。一个对象中的方法,它是属于类的,而对象是由类实例化而产生的。因而,一个类可以产生很多对象。而对象中都包含了相同的方法。对象在调用方法时,其实是使用类的方法。此时的问题就出现了。类如何去识别是哪个对象请求调用的呢?为了解决这个问题,引入了this指针。而在成员函数中都隐含了一个this指针参数,这样,对象调用时就用这个this指针来识别对象,哪个对象调用了这个函数,这个this指针就指向哪个对象,从而就解决了问题。this是指向对象的,那么*this就可以代表这个被指向的对象了。那么this的用法就显而易见了,就是一个指针而已。相信指针都很熟练了,这里就不赘述了。

以上只是我的个人观点,有不准确的地方恳请大家指出,非常感谢!