首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >C语言入门知识点(13.指针篇结局与易混淆类型)

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

作者头像
say-fall
发布2026-01-15 10:06:57
发布2026-01-15 10:06:57
290
举报

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

前言:

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

正文:

1. 普通指针类型:
代码语言:javascript
复制
// 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. 数组与指针的复杂组合
代码语言:javascript
复制
// 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. 函数指针的复杂形式
代码语言:javascript
复制
// 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. 指针的指针(二级指针)及多级指针
代码语言:javascript
复制
// 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.结合场景记忆:
  • 带 () 且内部有 * + 变量名 → 多为指针(数组指针、函数指针)。
  • 变量名后直接跟 [] → 多为数组(指针数组、函数指针数组)。
  • 变量名后直接跟 (参数) → 多为函数声明(返回指针的函数)。

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

  • 本节完…
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-10-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言:
  • 正文:
    • 1. 普通指针类型:
    • 2. 数组与指针的复杂组合
    • 3. 函数指针的复杂形式
    • 4. 指针的指针(二级指针)及多级指针
    • 5. 关键区分原则
      • a.优先级顺序:() > [] > *,通过括号改变结合顺序(如 (*p)[] 与 *p[] 的区别)。
      • b.从变量名出发拆解:先看变量名与哪个符号(* 或 [] 或 ())先结合,逐步推导整体类型。
      • c.结合场景记忆:
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档