前言
本文中出现的 puts() 、strlen() 函数需引入 string.h 头文件
#include <string.h>
一、初始化
方法 1 运用不规定大小的字符数组
char str1[]="happy";
方法 2 规定大小的字符数组
char str2[10]="to";
方法 3 运用指向字符串的指针
char *str2="birthday";
二、区别
我们分别用 strlen() 和 sizeof() 函数,看看“单词字节数”和“变量在内存中的字节数”的区别。
// 1 不规定大小的字符数组
printf("%s的长度为 %d,",str1,strlen(str1));// strlen() 输出了实际单词字节数 5
printf("str1在内存中的长度为 %d \n\n\n",sizeof(str1));// sizeof() 输出了实际字节数 6
// 2 规定大小的字符数组
printf("%s的长度为 %d,",str2,strlen(str2));// strlen() 输出了单词字节数 8
printf("str2在内存中的长度为 %d \n\n\n",sizeof(str2));// sizeof() 输出了指向char类型的指针变量在内存中的字节数 4
// 3 指针
printf("%s的长度为 %d,",str3,strlen(str3));// strlen() 输出了实际单词字节数 2
printf("str3在内存中的长度为 %d \n\n\n",sizeof(str3));// sizeof() 输出了定义的数组的长度 10
运行结果:
1 是因为末尾加了 \0
2 因为初始化时,规定了字符数组长度为 10
3 是因为 char * 类型的字节数为 4
在内存中的具体示意图可以参考 Master_Yoda 这位作者的 【C语言字符串数组两种不同的初始化方式的区别】这篇文章。
附录
完整测试代码如下:
#include <stdio.h>
#include <string.h>
int main()
{
//字符串的三种“方便的”初始化方法
// 1 不规定大小的字符数组
char str1[]="happy";
printf("%s的长度为 %d,",str1,strlen(str1));// strlen() 输出了实际单词字节数 5
printf("str1在内存中的长度为 %d \n\n\n",sizeof(str1));// strlen() 输出了实际字节数 6
// 2 规定大小的字符数组
char str2[10]="to";
printf("%s的长度为 %d,",str2,strlen(str2));// strlen() 输出了单词字节数 8
printf("str2在内存中的长度为 %d \n\n\n",sizeof(str2));// strlen() 输出了指向char类型的指针变量在内存中的字节数 4
// 3 指针
char *str3="birthday";
printf("%s的长度为 %d,",str3,strlen(str3));// strlen() 输出了实际单词字节数 2
printf("str3在内存中的长度为 %d \n\n\n",sizeof(str3));// strlen() 输出了定义的数组的长度 10
return 0;
}
运行结果: