指针:
指针(pointer) 是一个值为内存地址的变量 内存地址一般使用16进制表示比如0028FF44
指针的本质只是一个变量,指针大小为4个字节
指针的声明:
//第一种声明方式
int* ptr_i1; //偏向于地址,p理解为一个地址变量,int*是类型
//第二种声明方式
int *ptr_i2; //偏向于值,*p理解为一个int型变量,能表示一个整型值
//其他两种声明方式
int * ptr_i3;
int*ptr_i4;
关于指针声明方式*位置的不同:一元运算符*是间接寻址或间接引用运算符,当它作用于指针时,将访问指针所指向的对象。
int *ptr这样声明时便于记忆,该声明的表达式*ptr的结果是int类型,一般使用这种声明方式。
指针的赋值:
int i1; //变量
i1 = 100;
ptr_i1 = &i1; //&表示获取地址变量
*ptr_i1 = 200; //*表示取地址变量所对应的变量
cout << *ptr_i1<<endl; //输出200
cout << i1<<endl; //输出200
为指针赋值时,赋值运算符右侧必须是一个地址指针类型:
//1.空指针
//一般指针初始化值为nullptr 必须初始化所有指针
int *ptr1 = nullptr; //等价于 int *ptr1= 0; nullptr特殊的字面量的值,可以转化为任意指针类型
//指针也可以赋值NULL 等价于nullptr 但需要包含头文件cstdlib
int *ptr2 = NULL;
cout << endl;
//2.void *指针
//void*指针存放一个内存地址,地址指向的内容是什么类型不能确定,所以用void*指针取得的变量不能修改变量值
//void*指针一般用途:用于和别的指针比较、作为函数的输入和输出、赋值给另一个void*指针
double num = 3.14;
double *ptrNum1 = #
void *ptrVoid1 = #
cout << (ptrVoid1 == ptrNum1);
//*ptrVoid1 = 4.11; //无法这样修改,因为void*指针类型不确定 报错:表达式必须是指向完整对象类型的指针
指针与数组:
//数组存储在一块连续的内存空间,数组名是这块连续内存空间的首地址
double nums[5] = { 23,52,77,25,89 };
double *ptrNum = nullptr;
ptrNum = nums; //直接指向数组
//ptrNum = &nums[5]; //指向数组某个元素
cout << ptrNum[3] << endl; //当指针指向某一个数组,指针可以视为数组使用,因为数组名等于数组的首地址
cout << sizeof(ptrNum) << endl; //输出为4 指针变量占4个字节
指针的递增和递减:
double scores[5] = { 55,29,19,66,82 };
double *ptr_scores;
ptr_scores = scores;
for (int i = 0;i < 5;i++)
{
cout << *ptr_scores++ << endl; //指针的++和--相当于指针在内存空间的平移,移动单位为T的大小
}
cout << endl;
ptr_scores -= 2;
cout << *ptr_scores << endl; //输出66
引用:
//引用:为对象起了另外一个名字
int value = 1024;
int &refValue = value; //refValue 指向value,是value的引用
//错误引用: int &refValue2; //引用必须被初始化
//注意:引用并非对象,只是对一个已经存在的对象起的别名
//引用只能绑定在对象上,不能指向一个字面值或者表达式 //错误写法:例如 int &refNum = 10;
//但有一种情况可以把引用指向一个常量
const double &refCon = 10; //正确写法 表示常量引用
//引用必须被初始化,所以使用引用前不需要测试有效性,使用引用比使用指针效率高
指针与引用的关系:
1.引用是一种进行了简单封装的引用
2.引用底层仍然是指针,获取引用地址时,编译器会进行内部转换
3.引用的直接目的是为了让代码编写更加流畅
指针的简单应用:
使用指针来对一个数组进行逆序操作:
//逆序:首元素和尾元素交换
int arrays[8]{ 25,29,8,18,53,44,65,32};
int *ptr_start = arrays; //一个指针指向第一个元素
int startCount = 0;
int *ptr_end = arrays + 7; //另一个指针指向最后一个元素
int endCount = 7;
int temp = 0; //临时变量用于交换
while (ptr_start < ptr_end)
{
temp = *ptr_start;
*ptr_start = *ptr_end;
*ptr_end = temp;
ptr_start++;
ptr_end--;
cout << ptr_start << "\t" << ptr_end << endl;
}
for (int i = 0;i < sizeof(arrays) / sizeof(int);i++)
{
cout << arrays[i] << endl;
}
指针-自由空间分配:
//使用new来请求系统系统从自由空间分配内存
//new 返回一个指向分配的内存的指针
int *p1 = new int; //分配1个int
int *p2 = new int[5]; //分配5个int
delete p1; //释放由new分配的内存
//使用new创建动态分配的数组
int *intArray = new int[10];
//使用delete[]释放内存
delete[] intArray;
delete和new的使用:
1.delete与new配对,不要使用delete释放不是new的内存
2.不能释放已经释放的内存
3.使用delete[]来释放用new[]为数组分配的内存