理解指针*(*定义指针时的常见形式以及难点分析方法*)*

应当了解的基础部分:

本文在此规定指针的三要素以更好地理解指针:

  1. 指针指向的类型是什么?

  2. 指针的类型是什么?

  3. 指针指向了什么位置

    理解一个程序员创建指针的目的要首先能够回答上这三个问题。
    1.指针类型:把指针声明语句里的指针名字去掉,剩下的部分就是这个指针的类型。可以这样说:指向某种类型(该类型可能很复杂)的指针。
    2.指针指向的类型:将声明语句语句中指针名以及指针名左侧第一个指针声明符*去掉,剩下的就声明了指针指向的类型(即上文所指的某种类型)。
    3.指针指向的位置:指针指向的确切位置只有程序自己知道了,对编辑程序的人来说,能够判断指针是否为野指针即可。

基本定义

以下是一些基本的定义(可跳过):

int p;//声明一个整形变量
int p[9];//声明一个由整型数据组成的数组
int p(int);//声明一个带整型参数,返回一个整形量的函数p(x)

实际应用

了解到这些基本的定义之后将上面对三个要素的分析作为一种一般的分析顺序应用到实际的分析中:

int *p;//声明一个指向整型数据的指针

首先判断上面一行代码表示声明了一个“??”,名为p,从其左侧有一个指针声明符“*”,可以判断“??”为“指针”;
除去指针名以及其左侧的“*”号(记为Part.1=*+指针名)可以判断它指向的类型为int型;
这就是一个指向整型数据的指针;
同时因为没有为指针提供初值(指向位置),这是个野指针(可能无效)。(声明出一个野指针是一个很不zhuan好ye的习惯,这样的声明方式不能确定指针是否有效,以及使用指针时是否会修改计算机中的重要参数,威胁整个程序,甚至系统的稳定运行)

int (*p)[3]=NULL;//声明一个指向由整型数据组成的数组的指针

仍从指针名p开始看,由于在括号内,编译器先处理(*p),可以看出p是一个指针,这就是指针的Part.1
剩余部分为复合字面量“int[3]”所以指针指向了一个由整型数据组成的数组;
这就是一个指向由整型数据组成的数组的指针;
此时使用了一个NULL(空,不等于0也不等于\n)来为指针赋值(是无效指针),这样就避免了野指针无效且“危险”的属性,是很好的指针使用习惯,当然定义指针时也可以同时进行赋值(直接赋有效值就是有效指针)。

int **p=NULL;//声明一个二级指针

从p 开始,左侧第一个“*”说是p 是一个指针,指针名为p;
除去Part.1,剩余部分为“int*”这一个表示指向int型的指针的复合字面量
表示p指针指向了一个指向int类型的指针(二级指针)。
高级指针极少应用在复杂形式的表达中,没有必要为阅读代码增加难度,应减少二级以上指针在本就复杂的表达式中的应用。

int (*p)(int);//声明一个指向一个 以整型变量为参数 的 返回整型值的函数 的指针

(*p)部分表示p为一个指针;
除去Part.1,剩余一个int(int)复合字面量,说明指针个指向一个以整型变量为参数的返回整型值的函数;
所以p 是一个指向有一个整型参数且返回类型为整型的函数的指针

int *(*p(int))[3];//p是一个以整型数据为参数的 返回一个指向有整形指针变量组成数组的 指针变量的 函数

这是一个很费解的形式,先声明这个不是指针。
依旧从内部变量名开始分析:
由于()的优先级高于*,p是一个以int型为参数的函数,然后才是需要正确理解的关于指针的部分。
外层括号中函数声明左侧有一个“*”,所以函数返回的是一个指针。找到了函数返回的指针,剩下开始分析这个指针。
此时将整个(*p(int))看做函数返回的指针P(在下面的转换中P前没有紧连着一个*号,但是P的作用其实在定义中应与一个*ptr相同,这一点请着重理解)
那么就有了新的转换式:

//……略
#define P  (*p(int))
//……略
int *(P)[3];
//……略

同样去掉Part.1,剩余部分为一个名为int*[3]的符合字面量,这是指一个由三个指向整型指针变量组成的数组;
那么p就是一个参数为整型的 返回 一个指向由整型指针变量组成的数组的 指针变量的 函数.

总结

在理解复杂形式的指针时:
第一步:对优先级(理解顺序)的判断(基本上掌握()=[]>*即可);
第二步:从指针名开始从内而外逐层突破;
第三步:找到指针指向类型;
第四步:从第三步中找出指针类型;
第五步:从声明的形式中找到指针是否为野指针,以及指针的大概指向。
最 后:用自己的话说出指针的全部内涵。

发布了7 篇原创文章 · 获赞 2 · 访问量 2100

猜你喜欢

转载自blog.csdn.net/weixin_44486547/article/details/104172784