第12章:指针

1:我们要去动物园就要知道动物园的地址,计算机要找到变量i就要知道变量i的地址,也就是i在内存中的编号在这里动物园可以看成是变量i
2:用来保存内存地址的变量int a= 10;int *p = &a;
3:空指针:失控指针可以指向任何的内存地址,定义指针是必须初始化int *p = NULL
4:指针与类型:指针类型的不同决定了指针运算方式的不同,不能将一种类型的指针赋值给另一种类型的指针
5:用指针来访问值*p的意思是读取在该地址处的值
6:指针地址,指针保存的地址,该地址处的值
7:指针对数值的操作:通过间接运算符*来修改和访问该地址处的值
8:可以把一个变量的值赋值给另一个变量,也可以将一个指针的地址赋值给另一个指针
9:为什么要使用指针:
    1:处理堆中的大型数据
    2:快速访问类的成员数据和函数
    3:以别名的方式向函数传递参数
10:数据在内存中的存放
    1:栈:由编译器自动分配并释放,存放函数的参数,局部变量,函数结束时或者返回时释放
    2:堆:由程序员分配释放,程序员不释放,程序结束时可以由操作系统回收
    3:文字常量区:字符串常量 char *p = "hello world";将存放在文字常量区的字符串赋值给指针变量
    4:寄存器区:保存栈顶指针和指令指针
    5:全局区(static):全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,
    未初始化的全局变量和静态变量在相邻的另一块区域,程序结束有系统释放
    6:程序代码区:存放二进制代码
    注意:全局变量永远不会被释放除非程序结束全局变量被所有的类成员和函数所共享,因为全局变量的值很容易被修改可以使用堆来解决这个问题
11:delete删除堆中保存的内存空间,删除一个空指针是安全的,例如int *p = NULL;delete p;
12:假如没有删除一个指针,又对该指针重新赋值会造成内存泄露
13:既然可以在堆中保存变量,也就可以在堆中保存对象 class Human{};Human *p = new Human
14:在堆中删除对象 delete
15:访问堆中的数据成员 成员指针运算符->
16:我们可以将类的数据成员定义成指针,在类的构造函数中为该指针在堆中开辟内存空间
17:对象在栈(自动释放)和堆(程序员手动释放)中的不同
18:this指针,普通成员函数都有一个隐藏的this指针(记录每个单独对象的地址)
19:指针常见的错误:删除一个指针时,要将指针赋值为空(NULL),这时因为删除指针只会释放它所指向的内存(该内存不会被指针所独占),不会删除指针,
因此这个指针还存在,并且它仍然会指向原来的内存空间,这时如果你再次尝试使用该指针那么将会导致程序出错
20:指针的运算
    1:指针的加减运算
    int *p = new int;
    p++;
    p--;
    2:指针的赋值运算
    int *p = new int;
    int *p1 = p;
    3:两个指针可以相减得到的是地址差
    4:两个指针之间也可以进行比较运算,内存地址的比较
21:常量指针
    1:常量指针int *const p;指针的值(地址)是不可以改变,但是该地址处的值是可以改变的
    常量指针必须被初始化int a = 10; int *const p = &a;
    2:指向常量的指针const int *p;指针指向的值(对象)是可以被修改,但是该地址处的值是不可以修改的
    3:指向常量的常指针const int *const p指针指向的值(对象)是不可以被修改,该地址处的值也不可以修改
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值