初步了解——指针与取地址
1 | #include<cstdio> |
上面int p定义了一个指向int类型指针p(我们使用符号把p声明为指针),并初始化p使其指向int类型的变量num,
这里&num中的&是取地址操作符,当&作用于一个对象上时,它返回了该对象的地址。
所以这里指针p指向了num所对应的地址。(我测试时输出了0028FF1C)
如何使用指针?——解引用与指针赋值
1 | #include<cstdio> |
注意这里*操作符为解引用操作符,它返回指针p所指的地址所保存的值。
我们可以对*p赋值,从而改变p所指的地址上说保存的值,从而改变指向此地址的变量num的值。(num的值变为100)
当然,我们也可以给指针p赋值,使其指向另外一个地址:
1 | #include<cstdio> |
引用
从某种意义上来说,引用完全有别于上面说介绍的内容:
1 | #include<cstdio> |
补充
指向指针的指针:
1 | include<cstdio> |
由于指针也要占用内存空间存放其值,所以我们也可以定义一个指向指针的指针。
指针与数组:
指针和迭代器非常像,我们可以说指针就是数组的迭代器:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26#include<cstdio>
int val[100];
int main(void)
{
for (int i = 0; i < 100; ++i)
val[i] = i;
int *p = val;///等价于int *p = &val[0];
///数组的变量名就是一个指针
printf("%d\n", *p); ///指针p指向val的第一个元素,即val[0]
int t = 100;
while (t--)
///可以直接对指针进行加减运算,就和迭代器一样
printf("%d\n", *(p++));///输出0~99
///指针可以做差:
int *p2 = &val[10], *p3 = &val[20];
printf("%d\n", p3 - p2); //10
printf("%d\n", p2 - p3); //-10
///还可以比比较大小:
printf("%d\n", p2 < p3 ? p3 - p2 : p2 - p3); //10
return 0;
}
对于多维数组,只要把指向指针的指针理解好了就行:
1 | #include<cstdio> |