[C++]指针

指针

指针 顾名思义

就是指向一个元素(变量、数组、结构体、类...)的地址的变量

因为其指向元素多种多样

也就导致了其类型多种多样

以及有不同的语法

指针语法

符号表示

  • "*" 解地址符

表示解读地址 也就是把地址里的东西读出来

同时也用于定义

  • "&" 取地址符

表示取当前元素的地址

对于变量

  1. 定义指针
int *p;
//变量类型 *指针名称;

在不同的码风下

还可能会有这样的:

int* p;
int * p;

这里的含义都是一样的

“*”只能定义之后的第一个为指针

EG:

int* p,q;

此时 p 为指针

而 q 任为 int型 的变量

  1. 初始化/赋值
int a = 5;
int* p = &a;
/*
这样也可以:
int *p;
p = &a;
*/

指针是用于存储地址的

所以 p 的值当然要由 a 取地址再赋值

这样 p 里存的才是 a 的地址

  1. 调用
cout << "a的地址:" << p << endl;
cout << "a的取值:" << *p << endl;

对于数组

  1. 初始化/赋值
int arr[5] = {9,2,3,4,5};
int *p = arr;

这里数组名前面不用加 &

这是和变量的区别

  1. 调用
  • *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
请按任意键继续. . .

对于结构体

  1. 初始化
struct stu{
	int var;
}

stu s,*p = &s;

这里定义了指针 p 为结构体 s 的指针

和数组不同 结构体需要加 "&"

  1. 调用
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
请按任意键继续. . .

由此可见一二级指针的对应关系

posted @ 2021-05-09 11:29  Rosyr  阅读(75)  评论(0编辑  收藏  举报