指针知识总结

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了指针知识总结相关的知识,希望对你有一定的参考价值。

指针知识总结

一.指针

 定义:指针用来保存、操作内存,解决系统堆栈空间的溢出问题,可更为灵活的使用内存。

#地址是变量在内存中的编号,可用取地址符“&”来获得变量的地址。

#指针可以保存地址。

#野指针:每个指针必须有对应的一个变量地址,若没有就是一个野指针,其带有损害。

#空指针:解决办法是将指针初始化为零。

#指针只能存储、操作、运算与它类型相同的变量的地址。

#用指针访问变量值*p = i

 指针通过间接运算符“*+指针变量“p”来访问变量i的值。

                 int  a=1;

                 int  *p;

                 p = &a;

                 Cout<<*p;

 

#区分指针的地址、指针保存的地址和该地址的值。

#指针对数值的操作:间接访问该值(即读取该地址的数据),就可修改该数据(重新赋值)。

#更换指针保存的地址:改变指针的指向

     *将一个变量的赋给另一个变量

                     int  i =0;

                     int  j =1;

                     i = j;

     *可以将另一个变量的地址赋给已经保存了某个变量的地址的指针变量,如:

                     int  i =10;

                     int  j =20;

                     int  *p=&i;

                     P=&j;

 

#为什么用指针?

指针的三大用途

.处理堆中存放的大型数据

.快速访问类的成员数据和函数

.以别名的方式向函数传递参数

 

二.栈和堆

一般来说,写程序就是与数据打交道,在执行程序某一功能的时候,将该功能所需要的数据加载到内存中,然后在执行完毕的时候释放掉该内存。

#栈区——由编译器自动分配并释放,该区域一般存放函数的参数值,局部变量的值等。

#堆区——一般由程序员分配释放,若程序员不释放,程序结束时可能由操作系统回收。

#寄存器区——用来保存栈顶指针和指令指针。

#全局区(静态区)——全局变量和静态变量的存储是放在一块,程序结束后由系统自动释放。

#文字常量区——常量字符串就是放在这里的,程序结束后由系统自动释放。

#程序代码区——存放函数体的二进制码。

 

 

#堆和栈的不同:

1.内存申请方式上的不同

2.系统响应的不同

3.空间大小的不同

4.执行效率的不同

     .栈 栈由系统自动分配,因此速度较快。但程序员不能对其进行操作。

     .堆 堆是由程序员分配内存,速度一般比较慢,而且容易产生内存碎片,不过用起来很方便。

5.执行函数时的不同

 

#用指针创建堆中空间

                      int   *p;

                      P = new int;

等效于

                      int   *p = new int;

#用指针删除堆中空间

 当程序结束作为局部变量的指针自动消失后,计算机就再也找不到用new创建的内存了,就像丢失了这块内存一样,这种情况就是“内存泄露”

因此如果不需要一块内存空间,那么就必须对其指针使用关键字delete。如:

                      int   *p = new int;

                      delete  p;

这样释放指针所指向的内存,而不会释放指针。

   int   *p = new int;  //新建一块内存区域,用p指向它

   delete  p;         //删除指针指向的内存区域

   p = 0;             //置空指针

   delete p;          //再次删除该指针就没有危险

 

三.动态内存

#内存泄露:

                      int  *p = new int;

                      p = new int;

假如没有删除一个指针就对其重新赋值,就会造成内存泄露。

正确方法一:         

                      int  *p = new int;

                      delete  p;

                      p = new int;

方法二:不删除第一块内存空间,重新创建另开辟一块。

                      int  *p1 = new int;

                      int  *p2 = new int;

                      

#在堆中创建对象

                      Human  *p;

                      P = new Human;

等效于:

                      Human  *p = new Human;

#在堆中删除对象

                      Human  *p = new Human;

                      delete  p;

#访问堆中的数据成员

 如果访问对象的数据成员和函数,则使用 成员运算符.” 。 如:

  a.get( );

 如果是在堆中创建的数据成员和函数,而该对象的内存地址保存在指针变量p中,如:

  (*p).get( );

 使用括号是为了保证先使用*号读取p的内存地址,然后再使用成员运算符来访问成员函数get()

但是这比较麻烦,故而在C++里专有一个 成员指针运算符 “--->”,表示用指针来间接访问对象的成员。如:

  p ->get( );

#在构造函数中开辟内存空间

 A::A{ i = new int(999);}

 A::A{ delete  i;}

 

#this指针

对象对自己成员的专属标识。this变量记录每个对象的内存地址,然后通过间接访问运算符

->访问该对象的成员。this -> i;

 

四.指针的运算

1.指针的自加减运算

     int  *p = new int;

     p++;

     p- -;

     p=p-2;

 

2.指针的赋值运算

     int  *p = new int;

     int  *p1 = new int;

     p=p1;

3.指针的相减运算(两块内存的地址差)

     int  *p = new int;

     int  *p1 = new int;

     p=p1;

 

 

4.指针的比较运算

     int  *p = new int;

     int  *p1 = new int;

     if (p=p1)  //加入条件判断语句

    

五.指针与常量

#常量指针

将指针声明为常量指针,即指针不可变。如:

                        int  *const  p;

 但是它指向的整数是可以改变的。

 

#指向常量的指针

 定义一个指向常量的指针,如:

                        const  int *p;

该指针所指向的整数是不可修改的,但是该指针可被修改。

 

#指向常量的长指针

定义一个指向常量的常指针,如:

                        const  int *const  p;

那么该指针指向的整数是不可修改的,并且该指针也不可以被修改。


以上是关于指针知识总结的主要内容,如果未能解决你的问题,请参考以下文章

c语言指针知识点总结

C语言基础知识:最核心的—指针,知识总结(第二部分)

零基础学C语言知识总结十:二级指针指针数组和指向函数的指针

指针知识点总结

零基础学C语言知识总结十:指针及其相关知识

零基础学C语言知识总结十:指针及其相关知识