当前位置: 首页 > news >正文

C语言入门知识点(13.指针篇结局与易混淆类型)

  • 🌈🌈🌈这里是say-fall分享,感兴趣欢迎三连与评论区留言
  • 🔥🔥🔥专栏:《C语言入门知识点》、《C语言底层》
  • 💪💪💪格言:今天多敲一行代码,明天少吃一份苦头

前言:

通过6篇文章的学习,我们对指针已经很熟悉了,有的时候我们真正去用一些指针或者与之相关的结构,就很容易混淆,下面我们展示一些代码来加深记忆并且去分辨他们


文章目录

    • 前言:
    • 正文:
      • 1. 普通指针类型:
      • 2. 数组与指针的复杂组合
      • 3. 函数指针的复杂形式
      • 4. 指针的指针(二级指针)及多级指针
      • 5. 关键区分原则
        • a.优先级顺序:`()` > `[]` > `*`,通过括号改变结合顺序(如 (*p)[] 与 *p[] 的区别)。
        • b.从变量名出发拆解:先看变量名与哪个符号(* 或 [] 或 ())先结合,逐步推导整体类型。
        • c.结合场景记忆:


正文:

1. 普通指针类型:

// 1. 基本类型指针(指向单个变量)
int* p_int;        // 指向int类型变量的指针
char* p_char;      // 指向char类型变量的指针
float* p_float;    // 指向float类型变量的指针
double* p_double;  // 指向double类型变量的指针
short* p_short;    // 指向short类型变量的指针
long* p_long;      // 指向long类型变量的指针// 2. 常量指针(指向常量的指针,指针指向的值不可改)
const int* p_cint;   // 指向const int的指针(*p_cint不可改,p_cint可指向其他地址)
const char* p_cchar; // 指向const char的指针(字符串常量常用此类型)// 3. 指针常量(指针本身是常量,指向不可改,但指向的值可改)
int* const p_intc;   // 指向int的常量指针(p_intc不可改,*p_intc可改)
char* const p_charc; // 指向char的常量指针

2. 数组与指针的复杂组合

// 1. 二维数组的数组指针(指向二维数组的行)
int (*p_arr2d)[3];  // 指向"int[3]"类型数组的指针(可用于二维数组行操作)
// 示例:int arr[2][3] = {{1,2,3},{4,5,6}}; p_arr2d = arr;(指向第一行)// 2. 指针数组的数组(数组元素是指针数组)
int* p_arr[2][3];   // 2行3列的二维数组,每个元素是int*类型指针
// 解析:先结合[],形成二维数组,元素类型为int*// 3. 指向指针数组的指针(指针指向一个"指针数组")
int* (*p_parr)[5];  // 指向"int*[5]"类型数组的指针(数组有5个int*元素)
// 解析:p先与*结合成指针,指向的类型是int*[5](指针数组)

3. 函数指针的复杂形式

// 1. 指向"返回指针的函数"的函数指针
int* (*p_func1)(int);  // 指向"参数为int、返回int*的函数"的指针
// 示例:int* func(int x) { ... };p_func1 = func;// 2. 函数指针数组(数组元素是函数指针)
int (*p_func_arr[3])(int, int);  // 有3个元素的数组,每个元素是"指向参数为(int,int)、返回int的函数"的指针
// 解析:p_func_arr先与[]结合成数组,元素类型为int(*)(int,int)// 3. 指向"函数指针数组"的指针
int (*(*p_pfunc_arr)[3])(int, int);  // 指向"包含3个函数指针的数组"的指针
// 解析:p_pfunc_arr先与*结合成指针,指向的类型是int(*[3])(int,int)(函数指针数组)

4. 指针的指针(二级指针)及多级指针

// 1. 二级指针(指向指针的指针)
int a = 10;
int* p = &a;
int**pp = &p;  // 二级指针,指向int*类型的指针
// 访问:**pp 等价于 a(先解引用pp得到p,再解引用p得到a)// 2. 指针数组的二级指针(常用于动态二维数组)
int* arr[3];  // 指针数组(每个元素是int*)
int** p_pp = arr;  // 二级指针指向指针数组首元素(arr隐式转换为int**)// 3. 三级指针(指向二级指针的指针,较少用)
int*** p_ppp = &pp;  // 三级指针,指向int**类型的指针

5. 关键区分原则

a.优先级顺序:() > [] > *,通过括号改变结合顺序(如 (*p)[] 与 *p[] 的区别)。

即,如果没有括号就先和[]结合

b.从变量名出发拆解:先看变量名与哪个符号(* 或 [] 或 ())先结合,逐步推导整体类型。
c.结合场景记忆:
  • 带 () 且内部有 * + 变量名 → 多为指针(数组指针、函数指针)。
  • 变量名后直接跟 [] → 多为数组(指针数组、函数指针数组)。
  • 变量名后直接跟 (参数) → 多为函数声明(返回指针的函数)。

通过以上示例和原则,可以更清晰地区分各类指针相关类型,避免混淆。

  • 本节完…
http://www.dtcms.com/a/419793.html

相关文章:

  • 题解:AT_abc424_e [ABC424E] Cut in Half
  • 突破!再次新增【钓鱼邮件检测】能力
  • 闵行营销型网站建设tk网站注册
  • 西安做门户网站最好的公司手机app制作用什么软件
  • 【网络安全】二、入门篇:HTTP 协议进阶 ——GET/POST 常用传参方法详解
  • Apache Shiro 技术详解
  • 公众号授权网站莒县住房和城乡规划建设局网站
  • Day73 基本情报技术者 单词表08 操作系统进阶
  • [xboard]15 uboot加载内核启动分析
  • 从微分方程到FIR
  • 免费建立自己的网站代码一元夺宝网站怎么做
  • 网站备案前置审批表格做网站都注意哪些东西
  • 打开无忧管理后台网站装饰设计有限公司
  • Nginx 访问控制、用户认证、HTTPS配置实操手册
  • github repository 一个文件忘记添加到 .gitignore
  • 【STM32项目开源】基于STM32的智能语音分类垃圾桶
  • wordpress建站详细教程网页打不开视频怎么办
  • 【开题答辩全过程】以 基于Java的物流管理系统为例,包含答辩的问题和答案
  • BCEWithLogitsLoss
  • 在线设计网站大全网站建设方案推销
  • CUDA框架
  • 辽阳专业建设网站公司wordpress rss 爬取
  • TypeScript 简介与项目中配置
  • 南宁seo建站seo网站优化排名
  • 【每日一问】老化测试有什么作用?
  • 广州信科做网站dede 门户网站
  • 【JDBC】系列文章第一章,怎么在idea中连接数据库,并操作插入数据?
  • 企业的网站建设朔州网站建设收费
  • 外贸上哪个网站开发客户网站建设费可分摊几年
  • 8. mutable 的用法