1、sizeof( )是运算符,不是函数。
在编译时计算,因此不能用来返回动态分配(malloc)的内存空间的大小。
2、strlen( )是函数,要在运行时才能计算。
函数的参数必须是字符型指针(char *),必须是以'\0'结尾的。
strlen所作的仅仅是一个计数器的工作,它从内存的某个位置开始计算,直到碰到第一个字符串结束符'\0'为止,然后返回计数器值(长度不包含“\0”)。
注意:当数组名作为strlen的函数参数传入时,实际上数组就退化成指针了。
举例1:
char *s = "0234567";
sizeof(s); 结果 4 ===》s是指向字符串常量的字符指针
sizeof(*s); 结果 1 ===》*s是第一个字符
//大部分编译程序,在编译的时候就把sizeof计算过了,是类型或是变量的长度
举例2:
char arr[10] = "Hello";
int len_str = strlen(arr);
int len_sizeof = sizeof(arr);
cout << len_str << " and " << len_sizeof << endl;
//输出结果为:5 and 10
当arr是数组时,sizeof返回的是编译器为其分配的数组空间大小,不关心里面存了多少数据。
strlen只关心存储的数据内容,不关心空间的大小和类型。
注意:sizeof在不同平台的值并不一样
举例3:
char szPath[MAX_PATH];
//如果在函数内这样定义,那么sizeof(szPath)将会是MAX_PATH
//但是将szPath作为虚参声明时
void fun(char szPath[MAX_PATH]);
sizeof(szPath);却会是4(指针大小)
其实理解 sizeof 只需要抓住一个要点:栈
程序存储分布有三个区域:栈、静态和动态。能够从代码直接操作的对象,包括任何类型的变量、指针,都是在栈上的;
动态和静态存储区是靠栈上的指针来间接操作的。sizeof 操作符,计算的是对象在栈上的投影体积;记住这个就很多东西都很清楚了。
#include "iostream"
using namespace std;
class Base
{
virtual void VirtualFun();
};
class D1:Base
{
int i;
void NonVirtualFun();
};
class D2:D1
{
D1 *pD2;
};
class D3:D2
{
static int i;
static int GetIndex();
};
void main()
{
printf("%d\n",sizeof(Base));//4 虚函数(虚函数表)会占4个字节,一个类至少有1个字节(char型)来区分不同的类
printf("%d\n",sizeof(D1)); //8 函数不算在内,int是4个字节
printf("%d\n",sizeof(D2)); //12 比上一个多了一个指针
printf("%d\n",sizeof(D3)); //12 static类型的变量(函数)不算在对象内,整个类共享
system("pause");
}
#include <stdio.h>
int main()
{
printf("%d\n", sizeof(int)); // 4
printf("%d\n", sizeof(long)); // 4
printf("%d\n", sizeof(float)); // 4
printf("%d\n", sizeof(double)); // 8
printf("%d\n", sizeof(void*)); // 4 指针类型的为4
return 0;
}
#include <stdio.h>
#include<string.h>
int main()
{
char *s="hello";
printf("%d\n", sizeof(s)); // 4 指针类型的为4
printf("%d\n", sizeof(*s)); // 1 指向字符串的首地址 为1
printf("%d\n", strlen(s)); // 5 长度为5 不包括'\0'
//s[0]='a'; //编译时没有错误 但是运行时会出现停止运行 常量字符串
puts(s);
return 0;
}