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.结合场景记忆:
- 带 () 且内部有 * + 变量名 → 多为指针(数组指针、函数指针)。
- 变量名后直接跟 [] → 多为数组(指针数组、函数指针数组)。
- 变量名后直接跟 (参数) → 多为函数声明(返回指针的函数)。
通过以上示例和原则,可以更清晰地区分各类指针相关类型,避免混淆。
- 本节完…