概括
1 | int *p //声明指针变量 |
指针的声明
1 | int *ip; /* 一个整型的指针 */ |
指针的算术运算
指针是一个用数值表示的地址。因此,您可以对指针执行算术运算。可以对指针进行四种算术运算:++、—、+、-。假设 ptr 是一个指向地址 1000 的整型指针,是一个 32 位的整数,让我们对该指针执行下列的算术运算:
1 |
|
在执行完上述的运算之后,ptr 将指向位置 1004,因为 ptr 每增加一次,它都将指向下一个整数位置,即当前位置往后移 4 个字节。这个运算会在不影响内存位置中实际值的情况下,移动指针到下一个内存位置。如果 ptr 指向一个地址为 1000 的字符,上面的运算会导致指针指向位置 1001,因为下一个字符位置是在 1001。
1 | &a是:007FFDB0 |
指针数组
一个数组,数组的数据类型为指针
示例一
1 |
|
- 输出
1
2
3
4
5
6
7
8
9Value of *ptr[0] = 10
Value of *ptr[1] = 100
Value of *ptr[2] = 200
Value of var[0] = 10
Value of var[1] = 100
Value of var[2] = 200
Value of ptr[0] = 19921128
Value of ptr[1] = 19921132
Value of ptr[2] = 19921136
示例二
1 |
|
- 输出
1
2
3
4Value of names[0] = Zara Ali
Value of names[1] = Hina Ali
Value of names[2] = Nuha Ali
Value of names[3] = Sara Ali
指针的指针——二级指针
二级指针作为函数参数的作用:在函数外部定义一个指针p,在函数内给指针赋值,函数结束后对指针p生效,那么我们就需要二级指针。
1 |
|
- 输出
1
2
3
4
5&a(a的地址)=00C3F000,&b(b的地址)=00C3F004,&q(q的地址)=00C3F364
*q(指向地址的取值)=10,q(指向的地址)=00C3F000,&q(q的地址)=00C3F364
func:&p(p的地址)=008FFC80,p(p指向的地址)=00C3F000
func:&p(p的地址)=008FFC80,p(p指向的地址)=00C3F004
*q=10,q=00C3F000,&q=00C3F364
传递指针给函数
1 |
|
从函数返回指针
函数返回数组
1 |
|
- 输出
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
201523198053
1187214107
1108300978
430494959
1421301276
930971084
123250484
106932140
1604461820
149169022
*(p + [0]) : 1523198053
*(p + [1]) : 1187214107
*(p + [2]) : 1108300978
*(p + [3]) : 430494959
*(p + [4]) : 1421301276
*(p + [5]) : 930971084
*(p + [6]) : 123250484
*(p + [7]) : 106932140
*(p + [8]) : 1604461820
*(p + [9]) : 149169022
函数指针
通常我们说的指针变量是指向一个整型、字符型或数组等变量,而函数指针是指向函数。
1 |
|
回调函数
函数指针作为某个函数的参数,函数指针变量可以作为某个函数的参数来使用的,回调函数就是一个通过函数指针调用的函数。简单讲:回调函数是由别人的函数执行时调用你实现的函数。
1 |
|