目录
嗨嗨大家好呀~今天我来分享有关于指针的相关知识,你们在刚学的时候是不是有些懵懵的状态呢?那么本期博主的分享就是针对于小白或是对指针还没有真正了解的小伙伴们,一定要看完哦!接下来让我们一起来探索其中的奥秘吧!
注意:前言是基础!一定要看!一定要看!认真看!!!
前言:判断指针
想要了解指针,多多少少会出现一些比较复杂的类型,所以在这里先介绍一下如何完全理解一个复杂类型,要理解复杂类型其实很简单,一个类型里会出现很多运算符,它们也像普通的表达式一样,有优先级,其优先级和运算优先级一样,所以我大概总结了一下相应的原则:从变量名处起,根据运算符优先级结合,一步一步进行分析。下面让我们先从简单的类型开始慢慢分析吧:
1 基础类型
- int a:// 这是一个普通的整型变量。
- int* a :// 我们从 a 开始往前分析:首先 a 与 * 结合,这就说明了 a 是一个指针;然后再与 int 结合,说明该指针所指向内容的类型是整(int)型。所以 a 是一个返回整型数据的指针。
- int a[5]: // 首先从 a 开始,先与[ ]结合,说明 a 是一个数组,然后与 int 结合,说明数组里的元素是整型的,所以 a 是一个由整型数据组成的数组。
- int* a[5]:// 首先 a 与 [ ] 结合,这是因为 [ ] 的优先级比 * 高,这是 a 是一个数组,然后再与 * 结合,说明数组里的元素是指针类型,最后再与 int 结合,说明该指针所指向内容的类型是整(int)型。所以 a 是一个由返回整型数据的指针所组成的数组。
- int (*a)[3]: // 这里的()是为了改变优先级, a 先与 * 结合,说明 a 是一个指针;然后再与 [ ] 结合,说明指针所指向的内容是一个数组,然后再与 int 结合,说明数组里的元素是整型的。所以 a 是一个指向由整型数据组成的数组的指针。
我们掌握以上的基础后,来进一步研究复杂一点的类型:
2 复杂类型
- int **a:// 首先从 a 开始,先与 * 结合,说是 a 是一个指针,然后再与 * 结合,说明指针所指向的元素是指针,然后再与 int 结合,说明该指针所指向的元素是整型数据。由于更高级的指针极少用在复杂的类型中,所以后面更复杂的类型我们就不考虑多级指针了,最多只考虑二级指针。
- int a(int):// 从 a 处起,先与 () 结合,说明 a 是一个函数,然后进入 () 里分析,说明该函数有一个整型变量的参数,然后再与外面的 int 结合,说明函数的返回值是一个整型数据。
- int (*a)(int):// 从 a 处开始,先与指针结合,说明 a 是一个指针,然后与 () 结合,说明指针指向的是一个函数,然后再与 () 里的 int 结合,说明函数有一个 int 型的参数,再与最外层的int 结合,说明函数的返回类型是整型,所以 a 是一个指向有一个整型参数且返回类型为整型的函数的指针。
- int *(*a(int))[3]:// 我们从 a 开始进行分析,先与 () 结合,说明 a 是一个函数,然后进入 () 里面,与 int 结合,说明函数有一个整型变量参数,然后再与外面的 * 结合,说明函数返回的是一个指针,然后到最外面一层,先与 [ ] 结合,说明返回的指针指向的是一个数组,然后再与 * 结合,说明数组里的元素是指针,然后再与 int 结合,说明指针指向的内容是整型数据。所以 a 是一个参数为一个整型数据且返回一个指向由整型指针变量组成的数组的指针变量的函数。
到这里常见的指针类型基本讲完了,相信大家理解了这几个类型,在脑海中对指针内容有了新的认知,上面的这些类型足以供我们日常使用了。现在我们往下进行新的内容:
一 、详解指针
指针,是C语言中的一个重要概念及其特点,也是掌握C语言比较困难的部分。指针也就是内存地址,指针变量是用来存放内存地址的变量,在同一CPU构架下,不同类型的指针变量所占用的存储单元长度是相同的,而存放数据的变量因数据的类型不同,所占用的存储空间长度也不同。有了指针以后,不仅可以对数据本身,也可以对存储数据的变量地址进行操作。 为方便大家理解举例如下图:
指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址。要搞清一个指针需要搞清指针的四方面的内容:指针的类型、指针所指向的类型、指针的值或者叫指针所指向的内存区、指针本身所占据的内存区。下面我们来详细地说明:
1 指针的类型
从语法的角度看,你只要把指针声明语句里的指针名字去掉,剩下的部分就是这个指针的类型。
首先举第一个例子:
//我们来看这几种类型:
int*ptr;
char*ptr;
int**ptr;
int(*ptr)[3];
int*(*ptr)[4];
- int*ptr:// 指针的类型是int*
- char*ptr:// 指针的类型是char*
- int**ptr:// 指针的类型是int**
- int(*ptr)[3]:// 指针的类型是int(*)[3]
- int*(*ptr)[4]:// 指针的类型是int*(*)[4]
如此看来,找出指针的类型是不是非常容易?