sizeof 和 strlen 是 C 和 C++ 中常用的两个操作符或函数,用于获取数据的大小或长度,但它们之间有着本质的区别。
1. sizeof
- 作用:sizeof 是一个操作符,用于获取对象或类型在内存中所占用的字节数。
- 应用对象:sizeof 可以用于各种数据类型,包括基本数据类型(如 int, float, char 等)、结构体(struct)、联合体(union)、类(class)、数组等。
- 返回值:sizeof 返回的是对象或类型所占用的字节数,其返回值类型为 size_t。
- 编译时确定:sizeof 的结果是在编译时确定的,因为编译器需要知道对象或类型在内存中占用的确切大小来分配内存。
- 示例:
cpp复制代码
int x; | |
std::cout << sizeof(x) << std::endl; // 输出 4(在大多数32位系统上)或 8(在大多数64位系统上) | |
int arr[10]; | |
std::cout << sizeof(arr) << std::endl; // 输出 40(在大多数32位系统上,因为10个整数)或 80(在大多数64位系统上) |
2. strlen
- 作用:strlen 是一个函数,用于获取以 \0(空字符)结尾的字符串的长度(即字符数,不包括结尾的 \0)。
- 应用对象:strlen 只能用于以 \0 结尾的字符串。
- 返回值:strlen 返回的是字符串中的字符数,其返回值类型为 size_t。
- 运行时确定:strlen 的结果是在运行时确定的,因为字符串的长度取决于具体的字符串内容(直到遇到第一个 \0)。
- 注意:使用 strlen 之前必须确保字符串是以 \0 结尾的,否则可能导致未定义的行为(如越界访问)。
- 示例:
cpp复制代码
char str[] = "Hello, world!"; | |
std::cout << strlen(str) << std::endl; // 输出 13(不包括结尾的 '\0') |
总结
- sizeof 用于获取对象或类型在内存中的大小(字节数),编译时确定。
- strlen 用于获取字符串的长度(字符数),运行时确定,且仅适用于以 \0 结尾的字符串。
在编写代码时,需要根据具体情况选择使用 sizeof 还是 strlen。
C++中的其他数据类型是什么
在C++中,除了之前提到的基本数据类型(如整数类型、浮点类型、字符类型和布尔类型),还有几种其他重要的数据类型,这些数据类型在编程中也非常有用。以下是一些主要的C++数据类型:
- 指针类型 (pointer types)
- 指针是一个变量,其值为另一个变量的地址。在C++中,指针被广泛用于动态内存分配、函数参数传递和数组操作。
示例:
cpp复制代码
int x = 10; | |
int* ptr = &x; // ptr是一个指向整数的指针,存储x的地址 |
- 引用类型 (reference types)
- 引用是变量的别名,它提供了对另一个变量的直接访问。与指针不同,引用必须在声明时初始化,并且一旦初始化后就不能再指向其他对象。
示例:
cpp复制代码
int x = 10; | |
int& ref = x; // ref是x的引用,对ref的修改会影响x |
- 数组类型 (array types)
- 数组是一组相同类型的元素的集合,这些元素在内存中连续存放。数组的名称通常用作指向数组第一个元素的指针。
示例:
cpp复制代码
int arr[5] = {1, 2, 3, 4, 5}; // 一个包含5个整数的数组 |
- 结构体 (struct)
- 结构体是一种复合数据类型,允许你将多个不同类型的数据项组合成一个单独的类型。
示例:
cpp复制代码
struct Person { | |
std::string name; | |
int age; | |
}; | |
Person p; | |
p.name = "Alice"; | |
p.age = 30; |
- 联合体 (union)
- 联合体是一种特殊的数据类型,允许你在相同的内存位置存储不同的数据类型。但是,联合体在任何时候只能保存一个数据成员的值,因为联合体中的所有成员共享同一块内存空间。
示例:
cpp复制代码
union Data { | |
int i; | |
float f; | |
char str[20]; | |
}; |
- 枚举类型 (enum)
- 枚举类型是一种用户定义的数据类型,它包含一组命名的整数值。枚举类型通常用于表示一组固定的常量值。
示例:
cpp复制代码
enum Color { RED, GREEN, BLUE }; | |
Color myColor = RED; |
- 类 (class)
- 类是C++中面向对象编程的核心。类定义了一种新的数据类型,包含数据成员(属性)和成员函数(方法)。类允许你创建对象,这些对象具有状态(由数据成员表示)和行为(由成员函数表示)。
示例:
cpp复制代码
class Rectangle { | |
public: | |
int width, height; | |
Rectangle(int w, int h) : width(w), height(h) {} | |
int area() { return width * height; } | |
}; |
- 函数指针 (function pointers)
- 函数指针是指向函数的指针,可以用来调用函数。函数指针在回调函数、信号处理和函数表等场景中非常有用。
示例:
cpp复制代码
void myFunction() { | |
// ... | |
} | |
void (*funcPtr)() = myFunction; // funcPtr是一个指向myFunction的函数指针 | |
funcPtr(); // 调用myFunction |
- 模板 (templates)
- 模板是一种创建类或函数的通用版本的方法,可以处理多种数据类型。模板在C++标准库中广泛使用,如std::vector、std::map等。
示例:
cpp复制代码
template <typename T> | |
T max(T a, T b) { | |
return (a > b) ? a : b; | |
} |
这些数据类型和概念共同构成了C++丰富的类型系统,使得C++成为一种功能强大、灵活多变的编程语言。