一、本质
- '\0'就是8位0000 0000,因为字符类型中并没有对应的这个符号,所以按照这种方式来写,将'\0'作为字符串的结束标志.
- '\0'是转义字符,意思是告诉编译器,这个不是字符'0',而是空字符.
- 空字符'\0'对应的二进制为0000 0000(对应十进制为0),而字符'0'为0011 0000(对应十进制为48).
二、说明
- 把一个字符串赋值给数组:
char str[] = {"123"};
实际上数组str在内存中的存放情况为: 1 2 3 \0
- 最后一位'\0'是c编译系统自动加上,所以在用字符串赋初值的时候一般无需指定数组的长度,而由系统自行处理.
- 把字符数组str1中的字符串拷贝到字符数组str2中的时候,串结束标志'\0'也一同拷贝.
三、分析
- 当数组长度不够,如:
char str[3] = {'123'}
,由于字符数组str的长度为3,所以后面的信息会丢失,即'\0'丢失.
- 如果在给数组赋值的时候,把每一个字符单独用引号括起来,也会丢失'\0'.
char str[] = {'1','2','3'};
- 如果希望数组已'\0'结束,则可以写成一下三者之一:
- char str[] = {'123'};
- char str[] = {'1','2','3','\0'};
- char str[4] = {'1','2','3'}; //故意给数组预留空的位置
#include<stdio.h>
#include<iostream>
using namespace std;
int main()
{
char s[] = "123";
char a = '0';
printf("%s\n",s);
printf("字符1的ascall: %d\n",s[0]);
printf("字符a的ascall: %d\n",a);// 这里输出的是字符的ASCALL码
printf("%c\n", s[0]);
printf("反斜杠零的字符: %c\n", s[3]);
printf("反斜杠零的ascall: %d\n", s[3]);
char s1[] = "12";
char s2[10];
for(int i = 0;i<10;i++)
{
s2[i] = s1[i];
}
cout<< "字符数组s1的长度为:" << endl;
cout <<sizeof(s1)/sizeof(*s1) << endl;
cout<< "字符数组s2的长度为:" << endl;
cout << sizeof(s1)/sizeof(*s2) << endl;
}