[C++]指针
指针
指针 顾名思义
就是指向一个元素(变量、数组、结构体、类...)的地址的变量
因为其指向元素多种多样
也就导致了其类型多种多样
以及有不同的语法
指针语法
符号表示
- "*" 解地址符
表示解读地址 也就是把地址里的东西读出来
同时也用于定义
- "&" 取地址符
表示取当前元素的地址
对于变量
- 定义指针
int *p;
//变量类型 *指针名称;
在不同的码风下
还可能会有这样的:
int* p;
int * p;
这里的含义都是一样的
“*”只能定义之后的第一个为指针
EG:
int* p,q;
此时 p 为指针
而 q 任为 int型 的变量
- 初始化/赋值
int a = 5;
int* p = &a;
/*
这样也可以:
int *p;
p = &a;
*/
指针是用于存储地址的
所以 p 的值当然要由 a 取地址再赋值
这样 p 里存的才是 a 的地址
- 调用
cout << "a的地址:" << p << endl;
cout << "a的取值:" << *p << endl;
对于数组
- 初始化/赋值
int arr[5] = {9,2,3,4,5};
int *p = arr;
这里数组名前面不用加 &
这是和变量的区别
- 调用
- *p 取到的是数组的第一个元素
- *(p+n) 取到数组的第 n+1 个元素
效果展示
效果代码
#include<bits/stdc++.h>
using namespace std;
int main(){
int arr[5] = {9,2,3,4,5};
int *p = arr;
cout << p << endl;
cout << *p+1 << endl;
cout << *(p+1) << endl;
}
对应输出
0x22fe30
10
2
--------------------------------
Process exited after 0.02889 seconds with return value 0
请按任意键继续. . .
对于结构体
- 初始化
struct stu{
int var;
}
stu s,*p = &s;
这里定义了指针 p 为结构体 s 的指针
和数组不同 结构体需要加 "&"
- 调用
cout << (*p).var << p->var;
前者是一般的写法(但是用的很少)
表示先把 p 这个指针读出来
指向内容为一个结构体
再用 "." 来解析结构体的内容
后者是简化的写法
若 p 为一个结构体的指针
则可以直接用 "->" 把结构体内的元素解析出来
对于类
class class1{
public:
int a,b,c;
void add(){
c = a + b;
}
}x;
class1 *p = &x;
类和结构体基本是一致的
包括调用也是一样
而且 "->" 同样也可以用于类函数
cin >> p->a >> p->b;
p->add();
cout << p->c;
指针特殊用法
函数修改实参值
原理:
在函数中直接导入变量的地址
直接通过地址修改实参的值
效果展示
Code
#include<bits/stdc++.h>
using namespace std;
void add(int &x){//直接引入了地址
x++;
cout << x << " " << &x << endl;
}
int main(){
int a;
cin >> a;
add(a);
cout << a << " " << &a;
return 0;
}
Show
10
11 0x22fe4c
11 0x22fe4c
--------------------------------
Process exited after 3.173 seconds with return value 0
请按任意键继续. . .
取地址符与解地址符的交叉使用
int a = 10,*p = &a;
cout << p << endl;
//p内存的是 a 的地址
cout << *p << endl;
//解析 p 可得 a 的值
cout << &p << endl;
//取到 p 的地址
cout << *&p << endl;
//解析 p 的地址 仍为 p ,即 a 的地址
cout << **&p << endl;
//解析 *&p(a的地址) 既可得 a 的值
效果展示
Code
#include<bits/stdc++.h>
using namespace std;
int main(){
int a = 10,*p = &a;
cout << p << endl;
//p内存的是 a 的地址
cout << *p << endl;
//解析 p 可得 a 的值
cout << &p << endl;
//取到 p 的地址
cout << *&p << endl;
//解析 p 的地址 仍为 p ,即 a 的地址
cout << **&p << endl;
//解析 *&p(a的地址) 既可得 a 的值
return 0;
}
Show
0x22fe4c
10
0x22fe40
0x22fe4c
10
--------------------------------
Process exited after 0.1574 seconds with return value 0
请按任意键继续. . .
二级指针
即指针的指针
int x = 0, *p = &x;
cout << "&p:" << &p << " p: " << p << " *p: " << *p << endl;
int **t = &p;
cout << "t: " << t << " *t:" << *t << " **t:" << **t << endl;
&p:0x71feb4 p: 0x71feb8 *p: 0
t: 0x71feb4 *t:0x71feb8 **t:0
--------------------------------
Process exited after 0.891 seconds with return value 0
请按任意键继续. . .
由此可见一二级指针的对应关系