理解二級(jí)指針,先要理解指針
假有定義:
int a = 10, *p;
p = &a;
那么:
p:存放的是&a,根據(jù)表達(dá)式p = &a; 這個(gè)很好理解
&p: 指針變量p在內(nèi)存中的地址
*p:一級(jí)解引用,即為a的值
再有定義:
int **p2;
p2 = &p;
那么:
p2:存放的是p在內(nèi)存的中的地址。
目前都很好理解
那么 *p2里存放的是什么呢
首先p2中存放的是p在內(nèi)存中的地址,那么 *p2就是對p的地址進(jìn)行解引用,得到p的地址中所存放的數(shù)據(jù),由表達(dá)式
p = &a;
可知:p中所存放是a在內(nèi)存中的地址,所以*p2中值應(yīng)該等于&a
那么 **p2就是對 *p2進(jìn)行解引用,由上陳述可知: *p2存放的是變量a在內(nèi)存中的地址,則 **p2應(yīng)該是對a所在的內(nèi)存地址進(jìn)行解引用,應(yīng)該是變量a的值,為10;
主要是要理解:指針變量中存放的是一個(gè)地址,指針變量本身也是個(gè)變量,它自身在內(nèi)存也存放在某個(gè)地址上,對指針變量進(jìn)行解引用是對它存放的地址進(jìn)行解引用,得到為這個(gè)變量中所存放的地址中的數(shù)據(jù)。
#include <iostream>
using namespace std; // namespace std;
typedef struct TNode
{
int data;
int data2;
TNode *next;
}TNode;
bool Func1(void)
{
int a = 10, b = 50, c = 50;
int *p1, **p2;
p1 = &a;
p2 = &p1;
cout << __LINE__ << ":*p1=" << *p1 << endl; //輸出p1一級(jí)解引用的結(jié)果
cout << __LINE__ << ": p1=" << p1 << endl; //輸出p1中存放的數(shù)值, 應(yīng)該是a的地址(&a)
cout << __LINE__ << ": &a=" << &a << endl; //輸出a的存放地址
cout << __LINE__ << ":&p1=" << &p1 << endl; //輸出p1的地址
cout << __LINE__ << ":**p2=" << **p2 << endl; //輸出p2二級(jí)解引用結(jié)果
cout << __LINE__ << ":*p2=" << *p2 << endl; //輸出p2的一級(jí)解引腳的結(jié)果,應(yīng)該是p1的地址
cout << __LINE__ << ": p2=" << p2 << endl; //輸出p2中存放的內(nèi)容,應(yīng)該是p1的地址
cout << __LINE__ << ":&p2=" << &p2 << endl; //輸出&p2,是p2在內(nèi)存中的值
return true;
}
int main(void)
{
Func1();
return 0;
}
運(yùn)行結(jié)果:
18: *p1=10
19: p1=0x7ffffffed92c
20: &a=0x7ffffffed92c
21: &p1=0x7ffffffed938
22: **p2=10
23: *p2=0x7ffffffed92c
24: p2=0x7ffffffed938
25: &p2=0x7ffffffed940