一.一级指针与二级指针
最常用的指针就是一级和二级指针了,一级指针相信大家都很熟悉就不过多介绍了,二级指针相信一些鞋童可能还不熟悉,那我们就说一下。二级指针用官方的话说就是指向指针的指针,先上程序再解释。
指针推荐大家这样写int* a int** a
好懂
#include<iostream>
using namespace std;
int main(void){
int a = 100;
int* p1 = &a; //初始化,赋初值
cout << "----------" << endl;
cout << &a << endl; //取a的地址
cout << p1 <<endl;
cout << *p1 <<endl;
cout <<"------------" << endl;
int** p2 = &p1;
cout << &p1 << endl; //指针的地址
cout << p2 << endl; //p2中有什么??
cout << *p2 << endl; //*p2什么意思
cout << p1 << endl;
cout << **p2 << endl; //**p2什么意思
}
----------
0x6dfee8
0x6dfee8
100
------------
0x6dfee4
0x6dfee4
0x6dfee8
0x6dfee8
100
上面的程序可以用下图直观的表达出来
int** p2 = &p1
这就话的意思就是将p1的地址放到p2中去,就是赋值嘛,不推荐int **a
这种写法,很容易晕,尤其是看到**a
时候。
p2
很明显里面的内容是&p1,我们刚赋值了
*p2
的意思是取p2中保存的地址对应的内存中的内容,也就是p1中的内容,即&a。
**p2
再*p2
的基础上再加一个星,就是取a中的值
二.指针引用
跟二级指针一比,我只能说:卧槽,指针引用真好用。
先上代码,ChangeValue和ChangeValue2分别是用二级指针和指针引用实现的。
#include<iostream>
using namespace std;
struct Tearch{
int a;
float b;
};
int ChangeValue(struct Tearch** s){//二级指针
Tearch* temp = new Tearch;
temp->a = 10;
temp->b = 0.3;
*s = temp;
return 0;
}
int ChangeValue2(Tearch* &p){//指针引用
p = new Tearch;
p->a = 3; //给p赋值相当于直接给main中的h赋值
p->b = 2.5;
return 0;
}
int main(void){
Tearch* b = NULL;
ChangeValue(&b);
// cout << b->a <<endl;
Tearch* h = NULL;
ChangeValue2(h);
cout << h->a << endl;
}
从代码上来说指针引用更加清晰和易懂,可以直接将p看作是h的别名,只不过类型是结构体指针,而且没有借助中间变量。切记:将Tearch*
看作一个整体,可以类比为一个int
类型
写的不好之处,大佬请轻喷。