4章 指针和引用
2019-06-29 本文已影响0人
拿着苹果学猪叫
4.1指针定义与使用
- 程序用到的数据和声明的变量就存放在一个个字节中
- 不同类型的数据和变量占用是的字节数不同,如short型变量占用两个内存字节
- 内存单元:某个元素占用的几个字节成为内存单元
- 内存单元占用的字节数随其存储变量的不同而不同
通过“变量名”可以访问该变量对应内存单元,
实际上,我们还有可以直接通过“地址”来访问某个内存元素
4.1.1 声明一个指针变量是个双刃剑
指针是一种数据变量
和普通变量一样,在使用指针变量之前应该对指针变量进行声明
类型指针变量名://如intpNum;
“*”表明语句的是一个指针变量,类型指定了指针所指的内存单元的数据类型
提示:
可以将int*理解成一种复合类型,是指向int型数据的指针。
#include<iostream>
using namespace std;
int main()
{
double num = 3;//声明一个double型变量
double*pNum;//声明一个double型指针变量pNum
pNum = #//用num的地址为pNum赋值
cout << "pNum在内存中的位址是:" << &pNum << endl;
cout << "pNum的值为:" << pNum << endl;
cout << "num在内存的地址为:" << &num << endl;
cout << "可以使用指针访问num:" << *pNum << endl;//输出指针pNum占据的内存大小
cout << "pNum(指针类型)在内存中的字节数:" << sizeof(pNum) << endl;
//输出double变量num占据的内存大小
cout << "num(double型)在内存中的字节数" << sizeof(num) << endl;
return 0;
}
pNum在内存中的位址是:008FF9A4
pNum的值为:008FF9B0
num在内存的地址为:008FF9B0
可以使用指针访问num:3
pNum(指针类型)在内存中的字节数:4
num(double型)在内存中的字节数8
- *pNum相当于num变量,是间接访问方式
- &num相对于pNum,num的地址
- &(*pNum)相当于&num,num的地址
- (&num)相当于pNum ,变量num
4.1.4 指针赋值
- C++允许同类型的指针之间赋值
#include<iostream>
using namespace std;
int main()
{
short num1 = 100, *pNum1 = &num1;
//声明一个short类型指针,并用short变量Num1的地址给初始化
long*pNum2 = (long*)pNum1;//强制转换用pNum1位long型的pNum2赋值
cout << "pNum1的地址:" << &pNum1 << endl;
cout << "pNum2的地址:" << &pNum2 << endl;
cout << "pNum1的内容:" << &pNum1 << endl;
cout << "pNum2的内容:" << &pNum2 << endl;
cout << "pNum2指向的值为:" << *pNum2 << endl;
return 0;
pNum1的地址:006FFEBC
pNum2的地址:006FFEB0
pNum1的内容:006FFEBC
pNum2的内容:006FFEB0
pNum2指向的值为:-859045788
4.2 指针的运算
1.指针与整数的加减
指针与整数的加减,表示指针在内存空间向上或向下移动整数个单位内存,
- (单位是多少内存字节取决于指针所指变量的类型。)
- 例如,short型指针每次移动两个字节,double型指针每次移动8个字节。
指针变量进行加N运算:
指针变量新值=指针变量当前+N*指针所指类型占用的内存字节数
2.同类型指针间的比较
3.同类型指针相减
公式计算:
(指针1的值-指针2的值)/指针所指变量占用的内存字节数.
4.3动态内存分配
- 在C++中允许程序员用创建(new)和删除(delete)两个运算符对内存进行动态分配。
- 在程序运行时申请一块没有命名的内存来存储变量或者更复杂的数据结构,并把改内存的首地址记录下来,以备将来访问。
- 使用new动态分配内存。
为一个变量分配动态的内存的基本格式
类型名*指针变量名=new类型名
其中的“new类型名”通知编译器:需要开辟的内存是用来存储的值是什么类型,
new操作符能根据这个类型名来自动计算要分配的存储空间的大小。
int*pNum=new int
2.使用delete动态释放动态申请的内存
- 动态申请的内存,使用后归还给系统,以供其他程序使用。
基本格式:
delete指针
- 其中使用new动态申请的内存块,delete指令会释放动态申请的内存块,不会删除指针本身
3.使用new申请动态数组
基本格式
类型名*指针变量名=new类型名[元素个数]
- 和申请建立数组不同,使用new申请动态数组时,元素个数可以是变量,
int i=5
int*p=new int[i];//合法
- 这样可以避免数组越界,将数组的维度设的大,造成内存的浪费。
-提示:new无法对动态申请的数组存储区进行初始化,
-对于动态申请的数组,在使用过,应delete[]命令将内存释放,基本结构:
delete[]指针
-方括号在告诉,应释放整个数组,而不是指针指向的元素。
//使用new申请动态数组OperatorNew
#include<iostream>
using namespace std;
int main()
{
int num = 0;
int i;
cout << "请输入数组个数:" << endl;
cin >> num;
cout << "请依次输入" << num << "个整数(用空格隔开):" << endl;
//申请一块可存放num个int型数据的动态内存,将首地址赋值给指针
int*pSz = new int[num];
for (i = 0; i < num; i++)
cin >> pSz[i];//for语句为动态数组中的元素赋值
for (i = 0; i < num; i++)
cout << "第" << i << "个数为:" << pSz[i] << endl;
delete[]pSz; //释放动态内存
return 0;
}
请输入数组个数:
4
请依次输入4个整数(用空格隔开):
12
23
12
45
第0个数为:12
第1个数为:23
第2个数为:12
第3个数为:
4不要使用或释放已经释放的内存块
- 被delete释放的内存块,没有意义了。
5.使用malloc和free动态申请和释放内存
下次再看这里马一下
6.动态内存申请并不一定成功 - 一旦失败,标识符new和malloc()函数会返回空指针。
- 考虑程序就会崩掉的危险,在使用动态申请的内存块时,应该首先判断申请是否成功(指针是否为null)
char*pC!=new char[];
if(pC!=null)//执行操作
else//内存申请失败处理
- free()和delete()一个指针后,该指针所执行的动态内存被释放,但指针的值并发生变化,常称此时的指针为“野指针”。通常,在内存释放后,将指针赋值为null,这样便不会再次释放已经释放了的内存,并且,通过“if(指针!=null)”也可以进行防错。
4.4指针和const
const在不同位置可以达到三个目的:
- 禁止对指针赋值
- 禁止通过间接引用(*指针)对指针所指的变量赋值
- 即禁止对指针赋值,又禁止通过禁止通过间接引用(*指针)对指针所指的变量赋值
1.禁止对指针赋值
int x = 0;
int*const pInt = &x=