关于C指针的理解

一级指针:

C语言中,我们最常见的指针的形式就是一级指针了。比如:
int *p;
这是一个指向整型变量的指针。
char *p;
这是一个指向字符型数据的指针。

从定义上看,不难发现,指针它也是一个变量。
所以以后见到指针也不要慌,它就是一个变量。
那么指针变量里究竟存储的是什么呢?
相信大家也都知道,那就是一个地址。
假设有一个变量
int a = 520;
那么a的地址就是 &a.
那么我们就可以
p = &a;
这就使指针指向了a数据。p里存的是a的地址。
我们也可以定义指针的同时赋值:int *p = &a;

那么我们就又想了,指针是数据,那么它在内存中一定也有地址,那么指针的地址可不可以放在指针中呢?因为指针里存放的不就是地址吗?
答案是可以的。那么存放指针地址的指针是什么?那就是二级指针。

二级指针

二级指针的定义:
int **p;
char **p;
你一看,这不也就是个变量吗
只不过这个指针里放的是一级指针嘛
提到指针就要提到解引用
解引用就是取指针里地址指向的数据内容

那么二级指针解引用就是一级指针,
一级指针解引用就是其指向的内容。
int a = 10;
int *p = &a;
int **q = &p;

解引用的符号是*
所以*q == p;
*p == a;
a == 10;

既然二级指针是这样,那么二级指针也是数据,那么它的地址是不是也可以放在指针了呢?
所以就有了三级指针,四级指针等等。。。

指针和数组

说到数组,我们就会想起数组名有时候表示数组的地址。它在数值上与数组首元素的地址是一样的。
比如说,
int a[10];
在传参的时候。
假设有这样一个函数void search(int a[]);
在传参的时候,可以将数组名传进去
其实我们也可以这样写
void search(int *p)
传参的时候我们也可以传入数组名
这两种函数参数列表都可以传入数组名
因为数组名是数组的地址,指针里放的也是地址。
所以可以传进去。

这就是指针和数组的最常见的联系。

指针数组

我们都知道数组里面放的是同一种类型的数据。
那么我们也就可以将好多个指针放在数组里。
这样的指针也就是指针数组。

定义指针数组
int *p[9];
因为[]的优先级高,所以p先和[]结合,所以说这是一个数组。
然后在和 * 结合。
这是一个数组,里面存放的全部都是指针。
这就是指针数组。
int *p[] 和 int *(p[9])
表示的意思是一样的!

发布了57 篇原创文章 · 获赞 11 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_42419462/article/details/93752373
今日推荐