指针的作用
指针,顾名思义,就是指向某一东西的标志。
当我们想存地址时,就可以使用指针变量:
int a ;
int *b = &a ;
b
就是一个指针变量,存着a
的地址。
普通指针
普通指针就是上面的例子中的b
,它存着a
的地址,因此&a
和b
的输出结果是一样的。
存指针地址的指针
当我们想存指针地址时那该怎么办呢?
很简单,嵌套:
#include <cstdio>
using namespace std ;
int main()
{
int a ;
int *b = &a ;
int **c = &b ;
printf("%d %d %d", &a, b, c) ;
return 0 ;
}
这样就不会出错了。
取地址和解地址
*
既可以是乘号,又可以是解地址,还可以是指针变量;
&
既可以是按位与运算,又可以是取地址。
解地址,与取地址相反,就是按照地址去找地址里存的数。
我们可以使用指针变量解地址得到原本的数,例如:
#include <cstdio>
using namespace std ;
int main()
{
int a = 10 ;
int *b = &a ;
int **c = &b ;
printf("%d %d %d", a, *b, **c) ;
return 0 ;
}
这段代码输出的应该是三个同样10
,我们一个一个来:
a
,就是a
本身,输出10
;*b
,就是解地址b
,等于解地址&a
,等于a
,输出10
;**c
,就是解地址c
,等于解地址&b
,等于解地址&a
,等于a
,输出10
。
画个图更清晰:
**c=*(&b) → b=*(&a) → a = 10 → printf(10)
因此,解地址也是可以嵌套的。
指针数组和数组指针
指针数组,用来存指针的数组;
数组指针,数组的首地址。
我们使用时*a[100]
代表数组a
的地址,因为数组的优先级更高。弄一个指针数组应该写(*a)[100]
。
同样的,a
代表数组中第一个元素的首地址,&a
代表整个数组的首地址,我们是不是还可以这样写?
#include <cstdio>
using namespace std ;
int main()
{
int a[100] = {1, 2, 3, 4} ;
printf("%d %d %d %d", *(a + 0), *(a + 1), *(a + 2), *(a + 3)) ;
return 0 ;
}
输出1 2 3 4
,这与a[n]
的效果是一样的。
因此,我们得出结论:数组的本质就是指针。