字符串的定义及何时添加‘\0‘问题

定义字符串的六种形式:

①、 char *arr="hello world"; 

  原理:字符串常量的值本质上是第一个字符的地址。

②、 char *arr;arr="hello world"; 

  ①的改写。

③、 char arr[]="hello";

  用字符数组储存字符串,字符串在内存中的实际长度为6个char长度,包含了'\0'。

  1 printf("%d\n",strlen(arr));//5,strlen计算的长度不包含'\0',并在第一个'\0'处结束计算,比如对于字符串"abc\0def",strlen的计算结果是3
  2 printf("%d\n",sizeof(arr)/sizeof(arr[0]));//6,用sizeof计算的长度包含'\0'
  3 printf("%d\n",sizeof(arr)/sizeof(char));/,6,与上一个sizeof意义相同,是改写

④、char arr[]={'H','e','l','l','o','\0'}; 

  如果没有在末尾写'\0',就是普通的字符数组,不构成字符串。

 ⑤、 char arr[6]="Hello"; 

  定义定长数组时给的长度要至少比字符串实际长度大一位,为'\0'留位置。这个列子中,<5数组溢出编译失败,=5没有给'\0'留位置,就是普通的字符数组,不构成字符串。

  字符串要求结尾为'\0'充当结束标记,但字符数组不要求一定包含'\0'。不过要注意,当定义定长数组时,如果定的长度比字符串实际长度大,空的部分会自动填充'\0'。如 char arr[5]="ab"; ,实际是这样的:'a','b','\0','\0','\0'

  1 char arr[10]="hello";
  2 printf("%d\n",strlen(arr));//5
  3 printf("%d\n",sizeof(arr)/sizeof(arr[0]));//10
  4 printf("%d\n",sizeof(arr)/sizeof(char));//10

⑥、char arr[6]={'H','e','l','l','o'};

  定义定长数组时给的长度要至少比字符串实际长度大一位,为'\0'留位置,会自动补充'\0'。详见⑤。

常见的错误定义方法:

  •  char a[6]; a[6]="Hello"; 
  •   错误原因:a[6]是一个char型变量,"Hello"本质是第一个字符的地址,不能赋值。
  •  char a[6]; a="Hello";  char a[]; a="Hello";  
  •   错误原因:数组名a虽然是一个指针,但是已经指向内存中为a[6]分配的6个char长度空间,现在有让其指向“Hello”的地址,指针会出现混乱。注意与②的区别。

注意:

用字符数组形式定义字符串与指针形式定义字符串存在差别:

①、使用字符数组形式,是从字符串常量词中拷贝了一个副本,在修改字符数组中的内容时,只是修改副本,不会影响常量词中的字符串;

②、使用指针形式,会影响到常量词中的字符串。

 

  • 1
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值