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

简介: 【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*));

image.png

目录
相关文章
|
2月前
|
存储 C++
C++语言中指针变量int和取值操作ptr详细说明。
总结起来,在 C++ 中正确理解和运用 int 类型地址及其相关取值、设定等操纵至关重要且基础性强:定义 int 类型 pointer 需加星号;初始化 pointer 需配合 & 取址;读写 pointer 执向之处需配合 * 解引用操纵进行。
166 12
|
10月前
|
存储 程序员 编译器
C 语言中的数据类型转换:连接不同数据世界的桥梁
C语言中的数据类型转换是程序设计中不可或缺的一部分,它如同连接不同数据世界的桥梁,使得不同类型的变量之间能够互相传递和转换,确保了程序的灵活性与兼容性。通过强制类型转换或自动类型转换,C语言允许开发者在保证数据完整性的前提下,实现复杂的数据处理逻辑。
|
8月前
|
存储 人工智能 程序员
一文彻底搞清楚C语言的数据类型和变量
本文介绍了数据类型(基本、构造、指针、空类型)、变量(使用、命名规则、作用域)和常量(字面、符号、枚举、表达式),帮助初学者理解编程基础概念。坚持学习,定能创造奇迹!
872 1
一文彻底搞清楚C语言的数据类型和变量
|
8月前
|
存储 人工智能 Java
一文轻松拿捏C语言的指针的基础使用
本文介绍了C语言中的指针概念,包括直接访问和间接访问内存的方式、指针变量的定义与使用、取址运算符`&`和取值运算符`*`的应用,帮助读者深入理解指针这一C语言的核心概念。君志所向,一往无前!
146 0
|
10月前
|
存储 NoSQL 编译器
【C语言】指针的神秘探险:从入门到精通的奇幻之旅 !
指针是一个变量,它存储另一个变量的内存地址。换句话说,指针“指向”存储在内存中的某个数据。
307 7
【C语言】指针的神秘探险:从入门到精通的奇幻之旅 !
|
9月前
|
C语言
【C语言程序设计——入门】基本数据类型与表达式(头歌实践教学平台习题)【合集】
这份文档详细介绍了编程任务的多个关卡,涵盖C语言的基础知识和应用。主要内容包括: 1. **目录**:列出所有关卡,如`print函数操作`、`转义字符使用`、`数的向上取整`等。 2. **各关卡的任务描述**:明确每关的具体编程任务,例如使用`printf`函数输出特定字符串、实现向上取整功能等。 3. **相关知识**:提供完成任务所需的背景知识,如格式化输出、算术运算符、关系运算符等。 4. **编程要求**:给出具体的代码编写提示。 5. **测试说明**:包含预期输入输出,帮助验证程序正确性。 6. 文档通过逐步引导学习者掌握C语言的基本语法和常用函数,适合初学者练习编程技能。
226 1
|
10月前
|
存储 编译器 C语言
【C语言】指针大小知多少 ?一场探寻C语言深处的冒险 !
在C语言中,指针的大小(即指针变量占用的内存大小)是由计算机的体系结构(例如32位还是64位)和编译器决定的。
1141 9
|
10月前
|
存储 编译器 C语言
【C语言】数据类型全解析:编程效率提升的秘诀
在C语言中,合理选择和使用数据类型是编程的关键。通过深入理解基本数据类型和派生数据类型,掌握类型限定符和扩展技巧,可以编写出高效、稳定、可维护的代码。无论是在普通应用还是嵌入式系统中,数据类型的合理使用都能显著提升程序的性能和可靠性。
418 8
|
10月前
|
安全 程序员 C语言
【C语言】指针的爱恨纠葛:常量指针vs指向常量的指针
在C语言中,“常量指针”和“指向常量的指针”是两个重要的指针概念。它们在控制指针的行为和数据的可修改性方面发挥着关键作用。理解这两个概念有助于编写更安全、有效的代码。本文将深入探讨这两个概念,包括定义、语法、实际应用、复杂示例、最佳实践以及常见问题。
280 7
|
11月前
|
存储 C语言
C语言如何使用结构体和指针来操作动态分配的内存
在C语言中,通过定义结构体并使用指向该结构体的指针,可以对动态分配的内存进行操作。首先利用 `malloc` 或 `calloc` 分配内存,然后通过指针访问和修改结构体成员,最后用 `free` 释放内存,实现资源的有效管理。
887 13