C++中strlen()、sizeof()与size()的区别详解
初学 C++ 时常混淆获取长度的函数,本文将从原理出发对比 `strlen()`、`sizeof` 与 `size()`,明确它们适用的场景(C数组、类型/变量大小、STL string)并通过代码示例展示具体的返回值差异。
核心机制对比
第1步:理解 strlen() 的原理与限制
strlen() 是 C 标准库函数,专门用于处理以 null 结尾的 C 风格字符串。它接收 const char * 指针作为参数,从字符串头部开始逐个扫描字符,直到遇到第一个空字符 '\0' 停止,并返回中间包含的字符数量(不包含结束符本身)。
由于其底层逻辑依赖于 '\0',因此无法直接安全地用于统计未知长度或二进制数据中的字符个数,必须确保目标字符串正确终止。
第2步:掌握 sizeof 的内存计算特性
sizeof 并非普通函数,而是 C/C++ 的编译时运算符,括号内可以接受数组名、数据类型(如 int)、变量名等。它的核心作用是返回当前表达式所占用的物理内存字节数,该数值在编译阶段即已确定。
对于指针和基础类型,sizeof 的行为如下:
- 指向基本类型的指针:取决于系统架构(如 32位系统中通常为4字节)。
- 具体数据类型:如
double通常占用8字节。
#include<iostream>
using namespace std;
int main()
{
// 定义 double 变量及其指针
double pi = 3.14;
double* pt = π
cout << "sizeof(pt) = " << sizeof(pt);
cout << ", sizeof(*pt) = " << sizeof(*pt) << endl;
return 0;
}上述代码运行结果如下,直观展示了“指针地址占用空间”与“解引用后数值占用空间”的区别:
sizeof(pt) = 4, sizeof(*pt) = 8
结论:pt 是一个地址(指针),其自身占4字节;而 *pt 是指针指向的实际 double 数值,占8字节。
第3步:使用 size() 获取 STL 容器信息
在使用现代 C++ <string> 头文件定义的 std::string 对象时,应优先使用成员函数 size()(或等效的 length())。它同样返回字符串中实际的字符个数,但在实现上是通过查询对象的内部属性获得,无需扫描内存,效率稳定且不依赖手动放置 '\0' 结束符。
综合实践:array 与 string 的应用
需求场景
编写一个程序,接收用户三次输入的成绩数据,将其存储于 array 容器中,随后计算平均值并输出有效记录数量。同时验证对 string 长度获取的方法。
操作步骤
1. 准备环境:引入 iostream、array 和 string 库并开启命名空间。
2. 数据存储:创建固定大小为3的双精度浮点数数组来保存用户成绩。
3. 计算元素总数:利用 sizeof(数组名) / sizeof(单个元素) 的公式动态计算数组中有多少个成员。
4. 输出统计:分别调用不同类型的计数逻辑得出最终结果。
#include<iostream>
#include<array>
#include<string>
using namespace std;
int main()
{
// 初始化存储三次成绩的数组及测试用字符串
array<double, 3> grade;
string string_animal = "cat";
cout << "1st: ";
cin >> grade[0];
cout << "2nd: ";
cin >> grade[1];
cout << "3th: ";
cin >> grade[2];
// 计算平均成绩
double time = (grade[0] + grade[1] + grade[2]) / 3;
// 利用 sizeof 除法计算 array 的元素个数,并打印平均值与字符串长度
cout << "The number is " << sizeof(grade)/sizeof(grade[0]) << ", and grade is " << time << endl;
cout << "The number of string_animal is " << string_animal.size() << endl;
return 0;
}总结回顾
区分这三者关键在于识别操作对象的类型与目的:strlen() 针对特定格式的 C 语言字符流;sizeof 关注所有变量或类型在内存中所占用的绝对容量;size() 则是面向对象编程中 std::string 的标准用法。在实际开发中遵循匹配原则,能有效避免因类型转换不当导致的运行时错误或编译警告。
以上就是关于C++中strlen(),sizeof()与size()的区别的详细内容,更多关于C++ strlen(),sizeof()与size()的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









