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

c语言14:字符指针

在 C 语言中,字符指针(char*) 是处理字符串的核心工具之一。

它不仅能灵活指向单个字符,还能高效操作字符串常量。今天,我们就从基础用法到深层原理,全面探究字符指针的奥秘。

一、字符指针的基础:指向单个字符

字符指针最朴素的用法,是指向单个字符变量,通过指针间接访问或修改字符的值。

看这段代码:

#include <stdio.h>int main() 
{char ch = 'w';   // 定义字符变量ch,值为'w'char *pc = &ch;  // 字符指针pc指向ch的地址*pc = 'W';       // 通过解引用修改ch的值printf("ch = %c\n", ch);  // 输出:ch = Wreturn 0;
}

关键逻辑:

  • char *pc 声明了一个字符指针变量 pc
  • &ch 获取字符变量 ch 的内存地址,并赋值给 pc,此时 pc 就 “指向” 了 ch
  • *pc 是解引用操作,表示 “访问 pc 指向地址的内容”,因此 *pc = 'W' 等价于直接修改 ch 的值。

二、字符指针指向字符串常量:“地址” 而非 “内容”

字符指针更常见的场景,是指向字符串常量。很多初学者会误解 “把整个字符串存到指针里”,但本质是:指针存储的是字符串首字符的地址

看这个例子:

#include <stdio.h>int main() 
{const char* pstr = "hello bit.";  // 字符指针pstr指向字符串首字符'h'的地址printf("%s\n", pstr);  // 输出:hello bit.return 0;
}

深层理解:

  • "hello bit." 是字符串常量,C/C++ 会将其存储在只读数据区(防止程序意外修改常量内容)。
  • const char* pstr 中的 const 表示 “指针指向的内容是常量”—— 即不能通过 pstr 修改字符串(比如 *pstr = 'H' 会触发编译错误)。
  • pstr 本身只存了首字符 'h' 的内存地址,而非整个字符串的内容。printf("%s", pstr) 能打印完整字符串,是因为 C 语言约定:字符串以 '\0'(空字符)结尾,printf 会从首地址开始,直到遇到 '\0' 才停止。

三、字符数组 vs 字符指针:内存模型的本质区别

为了彻底弄清字符指针与字符串的关系,我们对比字符数组指向常量字符串的字符指针—— 这也是面试高频考点。

看这段经典代码:

#include <stdio.h>int main() 
{// 场景1:字符数组char str1[] = "hello bit.";char str2[] = "hello bit.";// 场景2:指向常量字符串的字符指针const char *str3 = "hello bit.";const char *str4 = "hello bit.";// 比较str1和str2if (str1 == str2)printf("str1 and str2 are same\n");elseprintf("str1 and str2 are not same\n");// 比较str3和str4if (str3 == str4)printf("str3 and str4 are same\n");elseprintf("str3 and str4 are not same\n");return 0;
}运行结果:
str1 and str2 are not same
str3 and str4 are same

深度分析:

1. 字符数组 str1 和 str2
  • char str1[] = "hello bit.";:程序会在栈内存中为 str1 分配一块空间,然后把字符串 "hello bit." 的内容拷贝到这块空间里。
  • str2 同理:也是在栈上单独分配一块新内存,再拷贝字符串内容。
  • 因此,str1 和 str2 是两块完全独立的内存(地址不同),所以 str1 == str2 为假(== 比较的是地址,而非内容)。
2. 字符指针 str3 和 str4
  • "hello bit." 是常量字符串,存储在只读数据区。编译器为了优化内存,会让多个指针共享同一个常量字符串的内存(只要字符串内容相同)。
  • str3 和 str4 都存储了这个常量字符串首字符 'h' 的地址,因此 str3 和 str4 指向的是同一块内存,所以 str3 == str4 为真。

四、字符指针的实用场景

除了基础用法,字符指针在实际开发中还有诸多妙用:

1. 函数参数传递字符串(高效性)

通过字符指针传递字符串,无需拷贝整个字符串(只传地址),效率更高:

#include <stdio.h>// 打印字符串的函数(接收字符指针)
void printString(const char *str) 
{printf("String: %s\n", str);
}int main() 
{const char *msg = "Hello, Function!";printString(msg);  // 传递的是“地址”,而非拷贝整个字符串return 0;
}

2. 动态分配字符串(灵活性)

结合 malloc 动态分配内存,可灵活控制字符串长度:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>int main() 
{// 动态分配能存10个字符的空间(包含结束符'\0')char *dynamicStr = (char *)malloc(10 * sizeof(char));if (dynamicStr != NULL) // 检查内存是否分配成功{  strcpy(dynamicStr, "Dynamic");  // 拷贝字符串到动态内存printf("Dynamic String: %s\n", dynamicStr);free(dynamicStr);  // 用完后释放内存,避免泄漏}return 0;
}

五、总结

字符指针是 C 语言操作字符串的核心工具,核心要把握三点:

  • 字符指针既可以指向单个字符,也可以指向字符串常量的首地址
  • 字符串常量存储在只读数据区,相同的常量字符串可能被编译器优化为 “共享内存”。
  • 字符数组是 “存储字符串内容的内存块”,而字符指针是 “指向字符串地址的工具”—— 二者在内存分配、比较逻辑上有本质区别。

掌握字符指针,不仅能更高效地操作字符串,也是理解 C 语言内存模型的关键一步。

http://www.dtcms.com/a/504904.html

相关文章:

  • 手机怎么制作自己的网站wordpress怎么盈利
  • 网站页面链接怎么做怎么做二维码转到网站
  • 织梦dede建站教程视频郑州区块链数字钱包网站开发方案
  • 东莞网站设计轻量应用服务器可以做网站吗
  • 房产网站建站亚马逊雨林动物
  • 北京网站搜索引擎优化推广seo搜索优化是什么意思
  • matlab构造带通巴特沃斯滤波器进行滤波
  • wordpress建网站缺点公司注册网上查名
  • 申请建设网站经费申请苍溪县规划和建设局网站
  • GESP C++ 二级拓展课 三
  • 在线做网站午夜伦理百度竞价冷门产品
  • 国土网站建设自查报告用dedecms做两个一样的网站
  • 集团网站建设计划表百度免费网站制作成品
  • 建设网站需要学什么程序项目开发流程8个步骤流程图
  • 海口哪里做网站帝国cms 商城网站视频教程
  • 门户网站建设公司教程网站开发 技术难点
  • 阿里云服务器创建多个网站做网站第一部
  • Python高级编程:不通过调用init方法创建实例的完整指南
  • 怎么在百度搜索自己的网站百度一下百度一下
  • 网站租用西安seo网站公司
  • 中国城乡建设部网站首页h开头的网页设计软件
  • 第3章,[标签 Win32] :窗口类05,cbClsExtra 和 cbWndExtra 字段
  • 企业网站建设的方案ppt徐州网站开发兼职
  • 东莞个人网站设计网站建设推广优化公司
  • 建筑设计类英文的网站计算机软件包含网站开发
  • 消息队列常见面试题
  • 遵义网约车平台哪家好抖音seo优化系统招商
  • 一般网站建设都用什么字体中国建筑八个局排名
  • 做网站的公司经营范围怎么写网站建设立项ppt模板
  • xtuoj 环