MST

星途 面试题库

面试题:C语言中字符串的存储与访问

在C语言中,有两种常见的定义字符串的方式,一种是字符数组,另一种是字符指针。请分别举例说明这两种方式如何定义一个字符串,并阐述它们在存储和访问方式上的区别。例如,对于字符串“Hello, World!”,用字符数组和字符指针分别如何定义,并且在访问字符串中的每个字符时,操作上有什么不同?
14.9万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

一键面试
  1. 字符数组定义字符串
    • 定义示例char str1[] = "Hello, World!";
    • 存储方式:字符数组在内存中分配一段连续的空间,用于存储字符串的每个字符,包括字符串结束符'\0'。这段空间的大小是字符串实际长度(包含'\0')。
    • 访问方式:可以通过数组下标来访问每个字符,例如str1[0]获取'H'str1[1]获取'e' 等。也可以使用指针算术运算来访问,如*(str1 + 0)获取'H' 。代码示例:
#include <stdio.h>
int main() {
    char str1[] = "Hello, World!";
    for (int i = 0; str1[i] != '\0'; i++) {
        printf("%c ", str1[i]);
    }
    return 0;
}
  1. 字符指针定义字符串
    • 定义示例const char *str2 = "Hello, World!"; (这里建议使用const修饰,因为字符串字面量通常是只读的)
    • 存储方式:字符指针本身存储的是字符串常量在内存中的起始地址。字符串常量存储在只读数据段(某些编译器环境下),它是不可修改的。
    • 访问方式:通过指针间接访问每个字符,如*(str2 + 0)获取'H'*(str2 + 1)获取'e' 等。也可以通过下标形式str2[0]str2[1]访问,但本质还是指针运算。代码示例:
#include <stdio.h>
int main() {
    const char *str2 = "Hello, World!";
    for (int i = 0; *(str2 + i) != '\0'; i++) {
        printf("%c ", *(str2 + i));
    }
    return 0;
}
  1. 区别总结
    • 存储位置:字符数组中字符串存储在栈上(局部数组)或静态存储区(全局数组),且内容可修改;字符指针指向的字符串常量通常存储在只读数据段,不可修改(除非去掉const修饰,但这是不安全且不推荐的)。
    • 内存分配:字符数组分配连续内存用于存储字符串;字符指针仅分配存储指针的内存,字符串常量存储另有位置。
    • 可修改性:字符数组可对单个字符进行修改,如str1[0] = 'h'; ;而对字符指针指向的字符串常量进行修改(如*(str2 + 0) = 'h'; )会导致运行时错误,因为其存储在只读区域。