(一)sizeof
首先要明确的一点是:sizeof并不是一个函数,而是一个单目操作符。它的功能是以字节的形式给出其操作数的存储大小。
sizeof可以使用在数据类型上,例如:sizeof (int) 等,也可以用于变量:sizeof (变量name),也可以写成sizeof 变量name(不加括号),因为它是一个单目的操作符。不是函数。
sizeof的结果是size_t类型的,也就是无符号整型。
当对一个char型数组的标识符应用了sizeof,那么他的结果是整个数组的大小,而不仅仅是该数组首指针的大小。eg. char a[10] sizeof (a) = 10,int a[10] sizeof(a) = 10*4 = 40;
当sizeof的对象是一个结构体或者是一个联合体的时候,那么他返回的结果是结构体或者联合的字节数,(注意,这个地方还包括了其中的填充,这些填充的是用来把结构体成员对齐到内存大小的,所以sizeof的结果有时不只只是简简单单的将成员相加。一般会使用pack字节对齐)。
当对一个未设定大小的数组或者结构体,sizeof操作就会失败。
示例程序:
#include <iostream>
#pragma pack(1)
using namespace std;
struct studentInfo
{
int iID;
char pName;
};
int main()
{
char a[10];//确定大小的数组
cout<<"sizeof(a) : "<<sizeof(a)<<endl;//结果是10
cout<<"sizeof(studentInfo):"<< sizeof(studentInfo)<<endl;//结果是5,当改为#pragma pack(2)时,结果则为6
}
(二)strlen
strlen是一个C语言的函数,它的功能就像是一个计数器,从内存的某个位置开始扫描,直到碰到第一个字符结束符‘\0’为止,返回统计值。
其原型为:
unsigned int strlen (const char* s),所属头文件为string.h
对于strlen的学习可以直接通过程序来观察:
int main()
{
char a[5];
char b[5] = {'a','b','\0','c'};
char *c = "Hello,World!";
memset(a, 0, 5);
memcpy(a,"Hello", 5);//此时数组a中放满了字符,没有'\0'。所以会导致strlen一直顺序扫描内存,直到出现'\0'
cout<<"strlen(a):"<<strlen(a)<<endl;
cout<<"strlen(b):"<<strlen(b)<<endl;//遇到'\0',就停止计数
cout<<"strlen(c):"<<strlen(c)<<endl;
}