### sizeof 运算符

sizeof 运算符以字节为单位确定某个数据类型或者对象的大小。例如：

int nLen = 100; //定义一个整型变量，初始化为 100

int nSizeObj = sizeof(nLen); //获取变量 nSizeObj 的大小，为 4，即 4 个字节

int nSizeType = sizeof(int); //获取 int 数据类型的大小，为 4，即 4 个字节

sizeof 运算符可以作用于某一个对象或者数据类型上。如果作用于某个对象上，可以写为“sizeof(对象)”或者“sizeof 对象”的形式。例如：

int nSizeObj = sizeof nLen; //等同于 int nSizeObj = sizeof(nLen);

但是，如果 sizeof 运算符作用域数据类型，则只能采用“sizeof(数据类型)”的形式，而不能使用“sizeof 数据类型”的形式。下面的语句是非法的。

int nSizeType = sizeof int; //非法的语句

sizeof 运算符不仅可以测试简单对象的大小，还可以测试数组的大小。例如：

int nArray[3] = {1, 2, 3}; //定义一个整型数组

int nArraySize = sizeof(nArray); //获取数组大小

此时，nArraySize 的值为 12。因为 nArray 数组中共包含 3 个元素，每一个元素为 int 类型，占 4 个字节，因此整体数组 nArray 的大小为 12 个字节。

从上例中可以发现，sizeof 运算符在操作数组时，返回的不是数组的长度，也不是数组中第一个元素的大小，而是数组中所有元素的大小之和。

使用 sizeof 运算符不仅可以测试变量的大小，还可以测试常量的大小。例如，测试一个整数和一个字符串的大小。

int nNumberLen = sizeof(1); //nNumberLen 等于 4

int nStringLen = sizeof("mrkj"); //nStringLen 等于 5

对于整型常量来说，会默认为 int 类型对待，因此“sizeof(1)”的结果为 4，即 int 数据类型的大小。而对于字符串常量来说，它将作为字符数组处理。为了确定字符串的长度，对于每一个字符串，系统会在其结尾添加一个“\0”的字符作为结束标记。因此字符串“mrkj”的长度为 5。我们在定义字符数组时，如果字符串中包含 4 个字符，则需要数组的长度大于 4。例如：

char pszText[5] = "mrkj"; //定义一个字符数组，并进行初始化

如果将数组 pszText 的长度设置为 4，则上面的语句无法通过编译。通常，在初始化字符数组时，不指定数组的长度，这样就可以避免因数组长度太小而导致初始化失败。例如：

char pszText[] = "mrkj"; //pszText 的长度为 5

这样，pszText 的长度依据用户提供的字符串长度确定。

使用 sizeof 运算符还可以测试指针的长度。例如：

int *pLen; //定义一个整型指针

char *pszText; //定义一个字符指针

double *pRate; //定义一个实型指针

int nIntPtr = sizeof(pLen); //获取整型指针的长度，为 4

int nCharPtr = sizeof(pszText); //获取字符指针的长度，为 4

int nDoublePtr = sizeof(pRate); //获取实型指针的长度，为 4

在上面的代码中，整型指针 pLen、字符指针 pszText 和实型指针 pRate 的长度均为 4。

注意：使用sizeof运算符测试指针长度时，无论指针的类型和指针所指向的数据是什么，只要在32位的操作系统上，指针的长度都是4。因为指针存储的是对象的地址，在32位系统上，地址采用32位的寻址方式，一个地址占32位，即4个字节。

在使用 sizeof 运算符测试数组的大小时，如果数组是作为参数传递到函数中的，那么在函数体中使用 sizeof 运算符测试数组的大小，其结果为 4。这是因为如果数组作为函数的参数，函数采用按引用方式传递，在函数体中数组参数将作为指针对待。

void ShowText(char szText[]) //定义一个函数

{

int nSize = sizeof(szText); //确定 szText 的大小，结果为 4

cout << szText << "的大小: " << nSize << endl; //输出信息

}

int main(int argc, char* argv[])

{

char szString[] = "mrsoft"; //定义一个字符数组，并初始化

ShowText(szString); //调用 ShowText 函数

return 0;

}

在上述代码中，表达式“sizeof(szText)”的结果为 4，因为参数 szText 被认为是一个指针。

sizeof 运算符能够在编译时刻确定表达式的值，因此，该表达式被认为是一个常量表达式，我们可以利用 sizeof 运算符构成的表达式作为数组的长度。例如：

int nArray[sizeof(int)]; //定义一个含有 4 个元素的数组

但是，如果将使用变量作为数组长度则是非法的，因为数组的长度要求是一个常量或常量表达式。

int nLen = sizeof(int); //定义一个整型变量

int nArray[nLen]; //错误的语句，变量不能够作为数组长度

上述代码在定义数组 nArray 时使用了 nLen 变量作为数组长度，导致不能编译。