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

C语言高频面试题——指针赋值字符串与定义一个数组赋值字符串有什么区别?


1. 定义方式

(1) 指针赋值字符串
char *str = "Hello, World!";
  • 含义
    • str 是一个指向常量字符串的指针。
    • 字符串 "Hello, World!" 被存储在只读的静态存储区(通常是程序的常量区),str 指向该字符串的首地址。
(2) 数组赋值字符串
char str[] = "Hello, World!";
  • 含义
    • str 是一个字符数组,大小为字符串长度加1(包括末尾的 \0 空字符)。
    • 字符串 "Hello, World!" 被复制到数组中,存储在栈或全局/静态存储区(取决于定义位置)。

2. 内存分配

(1) 指针赋值字符串
  • 存储位置:字符串存储在只读的静态存储区。
  • 内存布局
    • 指针变量 str 存储在栈上(如果是在函数内部定义)。
    • 字符串 "Hello, World!" 存储在只读区域,str 指向该区域。
  • 示意图
    +-------+       +-------------------------+
    |  str  | ----> | "Hello, World!\0"       |
    +-------+       +-------------------------+
    (栈)             (只读静态存储区)
    
(2) 数组赋值字符串
  • 存储位置:字符串存储在数组中,数组可以位于栈、全局/静态存储区。
  • 内存布局
    • 如果数组定义在函数内部,则数组存储在栈上。
    • 如果数组定义在全局或静态作用域,则数组存储在全局/静态存储区。
  • 示意图
    +-------------------------+
    | "Hello, World!\0"       |
    +-------------------------+
    (栈或全局/静态存储区)
    

3. 可修改性

(1) 指针赋值字符串
  • 不可修改
    • 字符串存储在只读区域,尝试修改会引发未定义行为(如运行时错误)。
    char *str = "Hello, World!";
    str[0] = 'h'; // 错误:试图修改只读区域的内容
    
  • 用途
    • 适用于不需要修改字符串内容的场景,例如字符串常量或只读数据。
(2) 数组赋值字符串
  • 可修改
    • 数组中的字符串存储在可写区域,可以自由修改。
    char str[] = "Hello, World!";
    str[0] = 'h'; // 正确:修改数组中的内容
    printf("%s\n", str); // 输出 "hello, World!"
    
  • 用途
    • 适用于需要修改字符串内容的场景。

4. 大小和灵活性

(1) 指针赋值字符串
  • 大小
    • 指针变量本身占用固定大小(通常为4字节或8字节,取决于系统架构)。
    • 字符串的实际大小与指针无关,存储在只读区域。
  • 灵活性
    • 指针可以重新指向其他字符串。
    char *str = "Hello";
    str = "World"; // 指针重新指向新字符串
    
(2) 数组赋值字符串
  • 大小
    • 数组的大小由字符串长度决定,包括末尾的 \0
    • 数组大小在定义时固定,无法动态调整。
    char str[] = "Hello";
    // 数组大小为6(5个字符 + 1个'\0')
    
  • 灵活性
    • 数组无法重新指向其他字符串,但可以通过拷贝等方式更新内容。
    char str[20] = "Hello";
    strcpy(str, "World"); // 更新数组内容
    

5. 使用场景

(1) 指针赋值字符串
  • 适用于:
    • 不需要修改字符串内容的场景。
    • 需要节省内存(只存储指针,不重复存储字符串)。
    • 字符串常量(如错误信息、提示信息等)。
(2) 数组赋值字符串
  • 适用于:
    • 需要修改字符串内容的场景。
    • 字符串长度较短且固定的场景。
    • 需要将字符串作为局部变量使用的场景。

6. 示例对比

代码
#include <stdio.h>void test_pointer() {char *str = "Hello, World!";printf("Pointer: %s\n", str);// str[0] = 'h'; // 错误:试图修改只读区域
}void test_array() {char str[] = "Hello, World!";printf("Array before modification: %s\n", str);str[0] = 'h'; // 正确:修改数组内容printf("Array after modification: %s\n", str);
}int main() {test_pointer();test_array();return 0;
}
输出
Pointer: Hello, World!
Array before modification: Hello, World!
Array after modification: hello, World!

7. 总结

特性指针赋值字符串数组赋值字符串
存储位置字符串存储在只读静态存储区字符串存储在栈或全局/静态存储区
可修改性不可修改可修改
大小指针大小固定数组大小由字符串长度决定
适用场景不需要修改字符串内容的场景需要修改字符串内容的场景

相关文章:

  • Pygame精灵进阶:动画序列与角色控制
  • Docker中修改OpenJDK 17 TLS禁用算法
  • 数据分析管理软件 Minitab 22.2.2 中文版安装包 免费下载
  • gtest 安装及使用
  • GPU 加速库(CUDA/cuDNN)
  • 2025年暨南大学 ACM校赛分析与题解
  • 数据结构顺序表的实现
  • react 报错
  • TortoiseGit 入门指南
  • [特殊字符] 深入理解Spring Cloud与微服务架构:全流程详解(含中间件分类与实战经验)
  • 什么是函数依赖中的 **自反律(Reflexivity)**、**增广律(Augmentation)** 和 **传递律(Transitivity)?
  • 大模型奖励建模新突破!Inference-Time Scaling for Generalist Reward Modeling
  • Python爬虫-爬取汽车之家各品牌月销量榜数据
  • Pygame终极项目:从零开发一个完整2D游戏
  • 一键快速转换音频视频格式的实用工具
  • Linux进程解析
  • Java操作数据库(JDBC)
  • C++异步并发支持库future
  • FPGA前瞻篇-组合逻辑电路设计-多路复用器
  • 云原生--核心组件-容器篇-3-Docker核心之-镜像
  • 辽宁省信访局副局长于江调任辽宁省监狱管理局局长
  • 欢迎回家!日本和歌山县4只大熊猫将于6月底送返中国
  • 在黄岩朵云书院,邂逅陈丹燕与月季花的故事
  • 5月1日起,涉外婚姻登记将在上海市16区全面铺开
  • 特朗普支持率降至新低:宣布关税后骤降,选民最不满经济表现
  • 人民日报:外卖平台应保障好骑手就业权益,消除后顾之忧