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

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

前言:

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



正文:

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.结合场景记忆:
  • 带 () 且内部有 * + 变量名 → 多为指针(数组指针、函数指针)。
  • 变量名后直接跟 [] → 多为数组(指针数组、函数指针数组)。
  • 变量名后直接跟 (参数) → 多为函数声明(返回指针的函数)。

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

  • 本节完…
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值