1、指针的定义初始化以及回收
指针是一个地址,这个地址内存放数据,这些数据就叫做“指针所指的数据”或者“指针指向的数据”。
指针类型存储的是被存储的数据的地址,即p的值是地址,*p 是p这个地址指向的值。
普通类型:
int main() {
//空指针初始化
int* p = nullptr; //整型指针初始化
p = new int(42);
cout << "Before *P=" <<*p << endl;
*p = 10;
cout << "After *P=" << *p << endl;
//回收指针
delete p;
return 0;
}
值 | 类型 | ||
---|---|---|---|
指针 | p | 0x00e0ffa8{10} | int* |
指针的间接引用 | *p | 10 | int |
指针的地址 | &p | 0x00cffd34 {0x00e0ffa8 {10}} | int** |
数组类型:
int main() {
//空指针初始化
int* q{ nullptr }; //数组指针初始化
q = new int[4]; //q存储的是数组首地址
for (int i = 0; i < 4; i++) {
cout << "Before *(q + i):" << *(q + i) << endl;
*(q + i) = i;
}
for (int i = 0; i < 4; i++) {
cout << "After *(q + i):" << *(q + i) << endl;
*(q + i) = i;
}
cout << "-------------" << endl;
cout << "*q:" << *q << endl;
cout << "*q+2:" << *q+2 << endl;
//回收指针
delete[]q;
return 0;
}
2、常量与指针
1)常量指针(常指针)
常量指针,即指向常量的指针,const在*前。
指向常量的指针必须也被声明为常量,即常量指针。
指针本身可以改变,但指针指向的常量不可改改变。
const int x = 1; //常量
const int* y=&x; //指向常量x的常量指针
下面的则是不被允许的
const int x = 1; //常量
int* y=&x; //这里会报错,因为指向常量的必须也声明为常量
常量指针,p可以更改,*p不可以更改
const int x = 1;
int z = 2;
const int* y=&x;
y = &z; // 可以,指针本身可以改
*y = z; // 不可以,指针指向的数据是常量,不能改
2)指针常量
指针的内容为常量,因为指针为常量类型,所以指针不能改变,但是指针指向的数据可以改变。
int x = 2,z=3;
int* const y = &x;
*y = 3; //可以,指针指向的数据是常量,可以改变
y = &z; //不可以,指针本身是常量,不能改变
3)总结
- 在前先读(*和const谁在前,谁先读)
- const在谁前,谁不可变
3、引用与指针
一般来说,用到的都是指针类型的引用。
例:
int* a = new int(10);
int*& b = a;
b为指向a的int*类型的引用,即b为a的引用,类型为int指针类型。
值 | 类型 | |
---|---|---|
a | 0x0149c208 {10} | int* |
b | 0x0149c208 {10} | int*& |
*a | 10 | int |
*b | 10 | int |
&a | 0x010ff7dc {0x0149c208 {10}} | int** |
&a | 0x010ff7dc {0x0149c208 {10}} | int** |
引用和指针的区别
引用 | 指针 | |
---|---|---|
初始化 | 定义时必须初始化 | 可以定义空指针 |
是否可以更改 | 一旦定义不可再更改,即成为a的引用后不能改为b的 | 指针p和*p都可以更改 |