C/C++对字符串常量的处理策略

本文通过C语言代码示例,详细解析了字符串比较的过程,展示了在不同文件中相同字符串常量如何分配内存,以及这如何影响字符串比较的结果。文章通过具体的代码运行结果,解释了在C语言中,即使字符串值相同,如果它们位于不同的文件中,其内存地址也可能不同,从而导致比较结果不一致的现象。
#include<stdio.h>
char *a="Hello";
extern void func();
int main()
{
    char *b="Hello";
    char *c="Hello1";
    if(a==b) 
      printf("a==b \n"); //两个指针指向同一块内存
    else
      printf("a!=b \n");
    if(a==c) 
        printf("a==c \n"); 
    else
      printf("a!=c \n");
    func();
    return 0;
}
#include <stdio.h>
extern char *a;
char *e="Hello";
void func()
{
    char *f="Hello";
    if(f==a) 
      printf("a==f \n");
    else
      printf("a!=f \n ");
    if(f==e) 
      printf("f==e \n");
    else
      printf("f!=e \n");
}

 最终结果:

a==b 
a!=c //前两个说明,同文件,同值的常量指向同一块内存
a!=f //1,3说明,同值不同文件,内存块不同

f==e//与1,2同样的验证

### C/C++ 中 char 数组、字符常量字符串常量的区别 在 C/C++ 中,字符常量字符串常量是两种不同的概念,它们的定义方式和用途也有所不同。以下是它们的具体区别: #### 1. 字符常量 字符常量是指用单引号括起来的一个字符,例如 `'a'` 或 `'1'`。它实际上是一个整数值,对应于字符在 ASCII 表中的编码值。例如,字符 `'a'` 的 ASCII 值为 97[^2]。 ```c char c = 'a'; // 定义一个字符常量 int asciiValue = c; // asciiValue 的值为 97 ``` #### 2. 字符串常量 字符串常量是指用双引号括起来的一串字符,例如 `"hello"`。在内存中,字符串常量是以字符数组的形式存储的,并且以空字符 `'\0'` 结尾。例如,字符串常量 `"hello"` 实际上在内存中表示为 `{'h', 'e', 'l', 'l', 'o', '\0'}`。 ```c const char* str = "hello"; // 定义一个字符串常量 ``` #### 3. char 数组 char 数组是一个可以存储多个字符的数组。它可以用来存储字符串,但并不强制要求以 `'\0'` 结尾。如果需要将 char 数组作为字符串使用,则必须以 `'\0'` 结尾,以便字符串处理函数(如 `strlen`)能够正确识别字符串的结束位置[^3]。 ```c char arr1[6] = {'h', 'e', 'l', 'l', 'o'}; // 不以 '\0' 结尾,不能作为字符串使用 char arr2[6] = "hello"; // 等价于 {'h', 'e', 'l', 'l', 'o', '\0'} ``` #### 4. 区别总结 | 特性 | 字符常量 | 字符串常量 | char 数组 | |--------------------|-----------------------------|-------------------------------------|-------------------------------------------| | 定义方式 | 单引号括起的单个字符 | 双引号括起的一串字符 | 使用数组定义的一组字符 | | 内存表示 | 单个字符的 ASCII 值 | 以 '\0' 结尾的字符数组 | 可能不以 '\0' 结尾的字符数组 | | 是否以 '\0' 结尾 | 否 | 是 | 可选 | | 使用场景 | 存储单个字符 | 存储字符串,用于字符串处理函数 | 存储一组字符,可能用于非字符串用途 | #### 示例代码 以下是一个综合示例,展示了字符常量字符串常量和 char 数组的区别: ```c #include <stdio.h> #include <string.h> int main() { char c = 'a'; // 字符常量 const char* str = "hello"; // 字符串常量 char arr1[6] = "hello"; // char 数组,等价于 {'h', 'e', 'l', 'l', 'o', '\0'} char arr2[5] = {'h', 'e', 'l', 'l', 'o'}; // char 数组,不以 '\0' 结尾 printf("Character: %c\n", c); // 输出字符常量 printf("String length: %lu\n", strlen(str)); // 输出字符串常量长度 printf("Array1 length: %lu\n", strlen(arr1)); // 输出 char 数组长度(以 '\0' 结尾) // printf("Array2 length: %lu\n", strlen(arr2)); // 错误:arr2 不以 '\0' 结尾 return 0; } ``` ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值