内置指针

什么是指针?
指针是一种特殊的变量.它的值是一个对象的地址,也称指针指向该对象.对指针进行解引用可以获取该对象.指针本身是一个对象,可以赋值和拷贝.

  • 指针中保存着它指向的对象的地址.直接输出指针的内容即指针指向的对象的地址.对指针进行解引用得到指针指向的对象
  • 二级指针中保存一个指针的地址, 这个被指向的指针中才真正保存着对象的地址.直接输出指针得到指针指向的一级指针的地址.对二级指针进行解引用得到一级指针指向的最终对象的地址(即一级指针的值).对一级指针进行解引用,得到最终对象

关于指针有一些很容易混淆的地方,下面举几个例子辨析一下.

示例1

1
2
3
4
5
6
7
int a = 10;
int *p = &a;
int **pp = &p; // pp是指向指针的指针,它指向指针p。解引用后是指针p。
cout<<"pp:"<<(pp)<<" &p"<<(&p)<<endl; // pp是指向指针变量p的指针,所以,pp中存放着整形指针变量p的地址
cout<<"*pp:"<<(*pp)<<" p"<<(p)<<endl; // pp是指向指针变量p的指针,*pp解引用pp会得到整形指针变量p,而p的值是一个整形变量a的地址
cout<<"p:"<<p<<" &a:"<<(&a)<<endl; // p是指向整形变量a的指针,所以,p中存放着整形变量a的地址
cout<<"*p:"<<p<<" a:"<<(a)<<endl; // p是指向整形变量a的指针。*p解引用整形指针p会得到一个整形数

运行结果

1
2
3
4
pp:0x7fff5ce9bf48 &p0x7fff5ce9bf48
*pp:0x7fff5ce9bf44 p0x7fff5ce9bf44
p:0x7fff5ce9bf44 &a:0x7fff5ce9bf44
*p:0x7fff5ce9bf44 a:10

示例2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
int a[5] = {1, 2, 3, 4, 5};
int *p, **k;
p = a;
k = &p;
cout << "a:" << a << " *a:" << *a << endl;
cout << "p:" << p << " *p:" << *p << endl;
cout << "k:" << k << " *k:" << *k << " **k:" << **k << endl;

cout << "=============================" << endl;
cout << "a:" << a << " *a:" << *a << endl;
cout << "p:" << p << " *(p++):" << *(p++) << " ";
cout << "after p++" << p << endl;
cout << "k:" << k << " *k:" << *k << " **k:" << **k << endl;

cout << "=============================" << endl;
p = a;
k = &p;
cout << "a:" << a << " *a:" << *a << endl;
cout << "p:" << p << " *(++p):" << *(++p) << " ";
cout << "after ++p" << p << endl;
cout << "k:" << k << " *k:" << *k << " **k:" << **k << endl;

运行结果

1
2
3
4
5
6
7
8
9
10
11
a:0x7ffcd38cc930 *a:1
p:0x7ffcd38cc930 *p:1
k:0x7ffcd38cc920 *k:0x7ffcd38cc930 **k:1
=============================
a:0x7ffcd38cc930 *a:1
p:0x7ffcd38cc930 *(p++):1 after p++0x7ffcd38cc934
k:0x7ffcd38cc920 *k:0x7ffcd38cc934 **k:2
=============================
a:0x7ffcd38cc930 *a:1
p:0x7ffcd38cc930 *(++p):2 after ++p0x7ffcd38cc934
k:0x7ffcd38cc920 *k:0x7ffcd38cc934 **k:2

可知, a是数组的名字,也是指向数组首元素的指针.p=a将指针p指向数组首元素.因此p的值是数组首元素的地址. p是数组首元素的值.
\
*k表明k是指向指向指针的指针, k指向指针p,因此,k中保存这指针p的地址,*k是指针p的值,也就是指针指向的对象地址,这里就是数组a首元素的地址.**k就是*(p)就是指针p指向的对象的值.