汉扬编程 编程大纲 指针很重要,2分钟彻底搞懂c语言指针,通透理解

指针很重要,2分钟彻底搞懂c语言指针,通透理解

指针通透理解口诀:先找到变量名(其他的都只是修饰符)

指针很重要,2分钟彻底搞懂c语言指针,通透理解

C规定:对于符号的定义,编译器总是从它的名字位置开始读(不是从开头也不是从结尾),再按照优先级顺序依次解析。

优先级从高到低依次:

1. 被括号( )括起来的那部分。

2. 后缀操作符:括号( )表示这是函数,方括号[ ]表示这是数组。

3. 前缀操作符:星号*表示“指向xxx的指针”。

实例练习int *p //p 可指向 int 类型数据,也可指向类似 int arr[n] 的数组。int **p //p 为二级指针,指向 int * 类型的数据。int *p[n] //p 为指针数组。[ ] 的优先级高于 *,所以为 int *(p[n]);int (*p)[n] //p 为二维数组指针。int *p() //p 是函数,它的返回值类型为 int *。int (*p)() // p 是函数指针,指向原型为 int func() 的函数。指针数组、二维数组指针、函数指针等几种复合的指针定义分别:

1. int *p1[6]; //指针数组

2. int *(p2[6]); //指针数组,和1的形式等价

3. int (*p3)[6]; //二维数组指针

4. int (*p4)(int, int); //函数指针

初学者对这几种形式都迷惑为什么 p1、p2 是数组,而 p3 却是指针呢,仅仅是一个括号的区别。

如果大家觉得上面几种形式的指针还能勉强接受,那么下面两个指针是不是让人抓狂呢?

1. char *(* c[10])(int **p);

2. int (*(*(*pfunc)(int *))[5])(int *);

看下面实例来快速理解。

实例练习1)int *p1[6];

从 p1 开始

[ ] 优先级高于 *,编译器先解析p1[6],p1 是拥有 6 个元素的数组,

再解析int *,说明数组元素的类型。

即:p1 是一个拥有 6 个 int * 元素的数组,也即指针数组。

2)int (*p3)[6];

从 p3 开始理解,

( ) 的优先级最高,编译器先解析(*p3),p3 首先是指针。

剩下的int [6]是 p3 指向的数据类型,它是拥有 6 个元素的一维数组。

即:p3 是指向拥有 6 个 int 元素数组的指针,就是二维数组指针。

为了能够通过指针来遍历数组元素,在定义数组指针时需要进行降维处理

例如

三维数组指针指向二维数组,

二维数组指针指向一维数组,

一维数组指针指向的是基本类型;

3)int (*p4)(int, int);

从 p4 开始理解,( ) 的优先级最高,编译器先解析(*p4),p4 首先是一个指针,

后边的( ) 说明 p4 指向的是一个函数,括号中的int, int是参数列表,

开头的int说明函数的返回值类型。

即:p4 是一个指向原型为int func(int, int);的函数的指针。

4)char *(* c[10])(int **p);

这有两个名,分别是 c 和 p,乍看起来 p 是指针变量名,其实不对。如果 p 是指针变量名,c[10]这种写法就又定义了一个新的名字,这就匪夷所思。

以 c 为变量名,先看括号内:

[ ] 的优先级高于 *,编译器先解析c[10],c 是个数组,前面的*表明每个数组元素都是指针,只是还不知道指向什么类型的数据。

整体上(* c[10])说明 c 是指针数组,只是指针指向的数据类型尚未确定。

接着() 优先级高于 * ,先看右边:

( )说明是函数,int **p是函数参数。

再看左边:

char * (* c[10]) (int **p);

char *是函数的返回值类型。

整体上看,可以将定义分成两部分:

char * (* c[10]) (int **p);

整体上就是:c 是一个拥有 10 个元素的指针数组,每个指针指向一个原型为char *func(int **p);的函数。

5)int (*(*(*pfunc)(int *))[5])(int *);

从 pfunc 开始,先看括号内:

pfunc 是指针,再看(int *):

根据优先级先看右边的(int *),表明是函数,int *是参数列表。

再看左边*,表明函数的返回值是指针,只是指针指向的数据类型不确定。

整体表明 pfunc 是指向函数的指针,现在函数的参数列表确定了,也知道返回值是一个指针(只是不知道它指向的数据类型)。

接着:[ ] 的优先级高于 *,

先看右边,[5] 表示这是一个数组,

再看左边,* 表示数组的每个元素都是指针。即* [5] 是一个指针数组,函数返回的指针就指向这样一个数组。

那么,指针数组中的指针又指向什么数据类型呢?

再向外跳一层括号:

右边是个函数,

左边是函数的返回值类型。

即指针数组中的指针指向原型为int func(int *);的函数。

即:pfunc 是函数指针,该函数的返回值是指针,指向一个指针数组,

指针数组中的指针指向原型为int func(int *)的函数。

相信经过上面的训练,大家再见到指针就不怕了吧。点击关注,下期再见。

本文来自网络,不代表汉扬编程立场,转载请注明出处:http://www.hyzlch.com/mianfei/5948.html

C\\C++语言27|多线程编程

C语言,C ,HTML,CSS,有哪些联系及其重要性?

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注

返回顶部