C 语言指针数据类型 ( 指针步长 | 复杂指针阅读技巧 )

Posted 韩曙亮

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C 语言指针数据类型 ( 指针步长 | 复杂指针阅读技巧 )相关的知识,希望对你有一定的参考价值。





一、指针步长



指针 也是一种 数据类型 , 其 类型 是 指针 指向的 内存空间 的 数据类型 ;

指针步长 : 根据 指针 指向的 内存空间 数据类型 确定 ;

int *p;
p++;

指针作为 函数参数 时 , 如果 函数形参 有多级指针 , 并且带 数组 / 函数 等相关复杂元素 ,

  • 编译 : 从编译器角度出发 , 只要是 指针类型 的参数 , 就在 栈内存 中 , 为其 分配 4 字节数据 ;
  • 使用 : 当在 函数 中 , 使用该指针指向的数据时 , 才关心该指针指向的数据结构 ;




二、复杂指针阅读技巧



如果遇到复杂指针类型 , 参考 【C 语言】指针 与 数组 ( 指针 | 数组 | 指针运算 | 数组访问方式 | 字符串 | 指针数组 | 数组指针 | 多维数组 | 多维指针 | 数组参数 | 函数指针 | 复杂指针解读)3. 解读 复杂的 指针声明 ( 难点 重点 | ①找出中心标识符 ②先右 后左 看 确定类型 提取 ③ 继续分析 左右看 … ) 博客章节进行分析 ;

指针 定义 复杂性来源 :

  • 1.数组指针 : 数组指针类型为 int (*) [5] , 即 一个指向 int[5] 的指针, 其指针变量名称写在中间的括号中
  • 2.函数指针 : 函数指针类型为 int(*)(int, int), 即 一个指向 int(int, int) 类型函数的指针, 其指针变量名称写在中间的括号中 ;
  • 3.数组指针混合函数指针 : 如果出现了 数组指针 指向一个函数, 这个指针可读性很差, 理解需要一定的功力 ;

复杂指针阅读技巧 ( 主要是 区分 函数指针 和 数组指针 ) 右左法则 :

  • 1.最里层标示符 : 先找到最里层的圆括号中的标示符;

    数组指针和函数指针的标示符 ( 指针变量名 ) 都在中间的圆括号中, 因此该步骤先找到指针变量名

  • 2.右左看 : 先往右看, 再往左看 ;

  • 3.确定类型 : 遇到 圆括号 “()” 或者 方括号 “[]” 确定部分类型, 调转方向 ; 遇到 * 说明是指针 , 每次确定完一个类型 , 将该类型提取出来 , 分析剩下的 ;

    一种可能性 :
    int (*) [5] , 遇到中括号说明是数组指针类型,
    int(*)(int, int) , 遇到圆括号 说明是函数指针类型 ;

  • 4.重复 2 , 3 步骤 : 一直重复, 直到 指针 阅读结束 ;


指针阅读案例 :

  • 1.解读案例 1 :
	/*
		解读步骤 : 
		1. 研究第一个标示符 p  
			( 1 ) 先找最里层的圆括号中的 标示符 p
			( 2 ) p 往右看, 是圆括号, 然后往左看, 是 * , 可以确定 p 是一个指针
			( 3 ) 将 (*p) 拿出来, 然后看剩下的部分, 右看是 圆括号 (, 明显是个函数类型, int (int*, int (*f)(int*)) 很明显是一个 函数类型
		2. 解读函数类型 int (int*, int (*f)(int*))
			( 1 ) 函数类型 int (int*, int (*f)(int*)) 的返回值类型是 int 类型
			( 2 ) 函数类型的第一个参数类型是 int* , 即 int 类型指针类型
			( 3 ) 函数类型的 第二个参数是 int (*f)(int*) 也是一个函数类型指针
		3. 解读 int (*f)(int*) 参数
			( 1 ) 标示符是 f, 由看 是 圆括号, 坐看是 * , 因此 f 是一个指针;
			( 2 ) 将(*f) 提取出来, int(int*) 是一个函数类型, 其返回值是 int 类型, 参数是 int* 指针类型
		
		总结 : 
		指针 p 是一个指向 int(int*, int (*f)(int*)) 类型函数的指针, 
			函数返回值是 int 类型, 参数是 int* 指针类型 和 int (*)(int*) 函数指针 类型
		指针 f 是一个指向 int(int*) 类型函数的指针, 其返回值是 int 类型, 参数是 int* 指针类型
	*/
	int (*p) (int*, int (*f)(int*));

以上是关于C 语言指针数据类型 ( 指针步长 | 复杂指针阅读技巧 )的主要内容,如果未能解决你的问题,请参考以下文章

C 语言二级指针作为输入 ( 二维数组 | 二维数组内存大小计算 | 指针跳转步长问题 )

C语言复杂类型说明一级指针传参二级指针传参指针的类型指针所指向的类型。

C/C++ 内存与指针

c语言 指针集合

重新学习C语言day14-指针进阶

九C语言之指针的进阶