
本文为 C 语言第十二天的学习笔记承接上一篇一维整型数组与指针的基础内容继续梳理指针模块的进阶核心知识点一维字符数组传参与遍历、指针函数与函数指针的辨析、const 修饰指针的三种形态。这部分内容是 C 语言笔试、面试的高频考点也是区分指针入门与进阶的关键节点。文章目录一、一维字符型数组传参1. 字符数组传参的本质2. 字符数组的两种遍历方式方式 1指针偏移法方式 2下标法二、指针函数与函数指针1. 指针函数返回指针的函数核心禁忌绝对不能返回局部变量的地址合法的返回场景2. 函数指针指向函数的指针三、const 修饰的指针1. 修饰指向的内容指针可变内容不可改2. 修饰指针本身指针不可变内容可改3. 双重 const指针和内容都不可改快速判断口诀总结一、一维字符型数组传参一维字符数组字符串的传参本质和整型数组一致数组作为参数传递时会退化为指向首元素的指针。但字符数组有特殊性 —— 字符串以\0作为结束标志因此传参时通常不需要额外传递长度可通过结束符自主遍历。1. 字符数组传参的本质和整型数组相同以下三种函数形参写法完全等价最终都会被编译器处理为指向首元素的指针// 写法1不指定长度的数组形式 int fun(char pstr[]); // 写法2指定长度的数组形式长度不生效仍退化为指针 int fun(char pstr[32]); // 写法3指针形式最贴近本质 int fun(char *pstr);2. 字符数组的两种遍历方式借助\0结束标志我们可以用两种方式遍历字符串效果完全等价char str[32] {0}; char *p NULL; p str; // 指针指向数组首元素等价于 p str[0];方式 1指针偏移法通过指针自增移动指向位置直到遇到结束符\0停止。while (*p ! \0) { p; // 指针向高地址偏移1个char大小 }方式 2下标法通过数组下标逐个访问元素本质是*(stri)的语法糖。int i 0; while (str[i] ! \0) { i; }二、指针函数与函数指针这是一对极易混淆的概念核心区分方法看本质是函数还是指针。1. 指针函数返回指针的函数本质是一个函数只是它的返回值是指针类型。定义格式返回值类型 *函数名(参数列表);int *fun(int x, int y); // 返回int*类型的函数 char *fun(void); // 返回char*类型的函数核心禁忌绝对不能返回局部变量的地址局部变量存储在栈区函数调用结束后栈帧会被销毁局部变量的空间会被系统回收。此时返回的地址就变成了野指针后续访问会触发未定义行为甚至导致程序崩溃。合法的返回场景返回全局变量、静态局部变量的地址生命周期贯穿程序全程返回堆空间malloc 申请的地址指针函数返回的指针可以直接作为另一个函数的实参使用2. 函数指针指向函数的指针本质是一个指针变量它指向一个函数存储的是函数的入口地址。定义格式返回值类型 (*指针变量名)(参数类型列表);// 定义一个函数指针p指向返回值为int、参数为两个int的函数 int (*p)(int, int);易错提醒括号不能省略如果写成int *p(int, int);就变成了「返回 int * 的指针函数」而不是函数指针。*和变量名用括号包裹才表示这是一个指针。三、const 修饰的指针const关键字的核心含义是只读被它修饰的内容不可被修改。根据const修饰的对象不同指针分为三类共 5 种写法是笔试必考内容。1. 修饰指向的内容指针可变内容不可改const int *p; // 写法1 int const *p; // 写法2与写法1完全等价修饰对象*p即指针指向的内存空间的内容特点指针变量p本身可以修改可以改变指针的指向不能通过*p修改指向空间里的值适用场景只读数据传递防止函数内部意外修改外部数据2. 修饰指针本身指针不可变内容可改int *const p;修饰对象p即指针变量本身特点指针变量p不可修改指向不能变定义时必须初始化可以通过*p修改指向空间里的值适用场景指针指向固定不允许被篡改3. 双重 const指针和内容都不可改const int *const p; // 写法1 int const *const p; // 写法2与写法1完全等价修饰对象同时修饰p和*p特点指针的指向不能修改指向的内容也不能修改定义时必须初始化适用场景完全只读的场景安全性最高快速判断口诀看const在*的左边还是右边const在*左边 → 修饰指向的内容内容只读const在*右边 → 修饰指针本身指针只读两边都有const→ 都只读总结字符数组传参同样退化为首元素指针借助\0结束符可实现下标、指针两种遍历方式。指针函数本质是函数返回指针函数指针本质是指针指向函数核心看*和括号的位置。指针函数严禁返回局部变量的地址避免野指针问题。const 指针核心看修饰对象修饰*p则内容不可改修饰p则指向不可改双重 const 则都不可改。