1. sizeof:关键字、操作符
sizeof是关键字也是操作符,但不是函数!!!
用于返回一个对象或者类型占用的字节数。
例1
char *p ="abcdef";
sizeof(p);
sizeof(*p);
返回4
返回1
如果修饰指针,sizeof(p)
计算的是指针 p
本身的大小,不是它指向的数据的大小。
指针的大小由架构决定,而不是由它所指向的数据类型决定。无论一个指针指向 int
、char
、double
还是 struct
,在同一个系统架构下,指针的大小都是相同的,在32位系统占用4字节,64位系统占用8字节。
因此sizeof(p)
返回4。
*p
是对指针 p
的解引用,它表示指针 p
指向的值。
因为 p
是一个 char *
类型的指针,所以 *p
是 p
所指向的字符串的第一个字符(在本例中为 'a'
)。而char占用1个字节,因此返回1。
例2
#include <stdio.h>
int main() {
int a[5] = {1, 2, 3, 4, 5};
printf("sizeof 数组名=%d\n", sizeof(a));
printf("sizeof *数组名=%d\n", sizeof(*a));
return 0;
}
sizeof 数组名=20
sizeof *数组名=4
1. 由于 a
是一个包含 5 个 int
元素的数组,而每个 int
在大多数系统中占用 4 个字节;
2. *a
表示对数组 a
的第一个元素进行解引用。对于数组 a
来说,*a
是 a[0]
。
a[0]
是一个 int
类型的元素。
因此,sizeof(*a)
实际上是 sizeof(int)
,即单个整数的大小。
在大多数系统中,sizeof(int)
也是 4 字节。
例3:
int arr[5] = {1, 2, 3, 4, 5};
int *p = arr;
printf("sizeof(arr) = %lu\n", sizeof(arr)); // 返回数组大小:20(5 * sizeof(int))
printf("sizeof(p) = %lu\n", sizeof(p)); // 返回指针大小:4(在32位系统上)
sizeof
的行为不同:
- 对数组名使用
sizeof
返回的是整个数组的大小(总字节数)。 - 对指针使用
sizeof
返回的是指针本身的大小(即存储指针的空间大小,通常是 4 字节或 8 字节,具体取决于系统)。
2. strlen:函数
往往用于计算字符串的长度(字符数),不包括'\0'。
strlen("\n\t\tag\AAtang")
返回11
\n \t \t a g \ A A t a n g