C53-字符串引入和注意事项.
一 基础语法
1. 底层关系
- 字符串本质是
char[]
(字符数组)以\0
(空字符)结尾的特殊形式。
char str[] = "hello"; // 实际存储:['h','e','l','l','o','\0']
- ✅ 可像数组一样通过下标访问字符
printf("%c", str[1]); // 输出 'e'
2.三种字符串的定义方式
-
char CharArry1[]={'h','e','l','l','o'};//不常用
-
char CharArry2[]="hello";
-
char *pCharArry3="hello"; //是常量指针
-
对比:第一种不太实用;第二三种比较:第二种可读可修改,第三种可读不可修改,是常量指针
- 数组:元素可修改(如
arr[0] = 'H'
合法)。 - 指针:指向的内容不可修改(如
p[0] = 'H'
非法)
- 数组:元素可修改(如
第三中定义方式的测试:
- 代码示例:
#include <stdio.h>
int main()
{char CharArry2[]="hello";char *pCharArry3="hello";for(int i=0;i<5;i++){printf("%c",*(pCharArry3+i));}return 0;
}
- 成果展示:
二 字符串的内存存放方式及结束标志
- 存放方式:
char[]
(字符数组)以\0
(空字符)结尾。这也导致了它的长度增加了1
char str[] = "hello"; // 实际存储:['h','e','l','l','o','\0']
- 代码示例:
#include <stdio.h>
int main()
{ int Arry[5]={1,2,3,4,5};char CharArry[]="hello";char CharArry1[]={'h','e','l','l','o'};int len1;int len2;int len3;len1=sizeof(Arry)/sizeof(Arry[0]);len2=sizeof(CharArry)/sizeof(CharArry[0]);len3=sizeof(CharArry1)/sizeof(CharArry1[0]);printf("len1:%d\nlen2:%d\nlen3:%d",len1,len2,len3);return 0;
}
- 成果展示:
三 sizeof与strlen的区别(非常重要)
相同点
- 均用于获取大小/长度信息
两者都返回一个与内存或字符串相关的数值(sizeof
返回字节数,strlen
返回字符数)。
不同点
特性 | sizeof | strlen |
---|---|---|
作用对象 | 任何数据类型(变量、类型、数组等) | 仅适用于字符串(以 \0 结尾的字符数组) |
计算时机 | 编译时确定(静态求值) | 运行时动态计算(遍历字符串直到 \0 ) |
返回值类型 | size_t (无符号整数) | size_t (无符号整数) |
是否包含 \0 | 包含 \0 的占用空间 | 不包含 \0 (仅统计 \0 前的字符数) |
对指针的处理 | 返回指针本身的大小(通常4/8字节) | 需指向有效字符串,否则行为未定义 |
示例 | sizeof(int) 、sizeof(arr) | strlen("hello") |
总结
sizeof
:编译器运算符,计算对象或类型的内存占用(包括\0
)。strlen
:库函数,运行时计算字符串的实际字符数(不包括\0
)。
我们直接测试
- 代码示例:
#include <stdio.h>
#include <string.h>int main()
{ char CharArry[100]="hello";//测试:sizeof返回字节数printf(" sizeof(CharArry):%d\n",sizeof(CharArry));//测试:strlen返回字符数printf(" strlen(CharArry):%d\n\n",strlen(CharArry));char CharArry1[]="hello";//测试:sizeof包含\0的占用空间printf("sizeof(CharArry1):%d\n",sizeof(CharArry1));//测试:strlen不包含\0(仅统计\0前的字符数)printf("strlen(CharArry1):%d\n\n",strlen(CharArry1));char *PString="hello";char *PString1;//测试:sizeof返回指针本身的大小(通常4/8字节)printf(" sizeof(PString):%d\n",sizeof(PString));//测试:需指向有效字符串,否则行为未定义printf(" strlen(PString):%d\n",strlen(PString));printf(" strlen(PString1):%d\n\n",strlen(PString1));return 0;
}
- 成果展示: