C语言sizeof函数解析

在 Pascal 语言中,sizeof() 是一种内存容量度量函数,功能是返回一个变量或者类型的大小(以字节为单位);在 C 语言中,sizeof() 是一个判断数据类型或者表达式长度的运算符。在Pascal 语言与C语言中,对 sizeof() 的处理都是在编译阶段进行。

  在C或C++语言中:sizeof是C/C++中的一个操作符,简单的说其作用就是返回一个对象或者类型所占的内存字节数。

其返回值类型为size_t,在头文件stddef.h中定义。这是一个依赖于编译系统的值,一般定义为

typedef unsigned int size_t;

sizeof有两种语法形式,如下:

sizeof(type_name);//sizeof(类型);
sizeof object;//sizeof对象;

所以

int i;
sizeof(i);//ok
sizeof i;//ok
sizeof(int);//ok
sizeof int;//error

sizeof计算对象的大小也是转换成对对象类型的计算,也就是说,同种类型的不同对象其sizeof值都是一致的。sizeof对一个表达式求值,编译器根据表达式的最终结果类型来确定大小,一般不会对表达式进行计算。如:

sizeof(2);//2的类型为int,所以等价于sizeof(int);
sizeof(2+3.14);//3.14的类型为double,2也会被提升成double类型,所以等价于sizeof(double);

sizeof也可以对一个函数调用求值,其结果是函数返回类型的大小,函数并不会被调用,我们来看一个完整的例子:

char foo()
{
printf("foo()hasbeencalled.\n");
return 'a';
}
int main()
{
size_tsz=sizeof(foo());
//foo()的返回值类型为char,所以sz=sizeof(char),foo()并不会被调用
printf("sizeof(foo())=%d\n",sz);
}

C99标准规定,函数、不能确定类型的表达式以及位域成员不能被计算sizeof值,即下面这些写法都是错误的:

sizeof(foo);//error
void foo2(){}
sizeof(foo2());//error
struct S
{
unsigned int f1:1;
unsigned int f2:5;
unsigned int f3:12;
};
sizeof(S.f1);//error

指针变量的sizeof

学过数据结构的你应该知道指针是一个很重要的概念,它记录了另一个对象的地址。在32位计算机中,一个指针变量的返回值通常是4(注意结果是以字节为单位),在64位系统中指针变量的sizeof通常为8。

char*pc="abc";
int*pi;
string*ps;
char**ppc=&pc;
void(*pf)();//函数指针
sizeof(pc);//结果为4
sizeof(pi);//结果为4
sizeof(ps);//结果为4
sizeof(ppc);//结果为4
sizeof(pf);//结果为4

的sizeof值与指针所指的对象没有任何关系,正是由于所有的指针变量所占内存大小相等,所以MFC消息处理函数使用两个参数WPARAM、LPARAM就能传递各种复杂的消息结构(使用指向结构体的指针)。

数组的sizeof

数组的sizeof值等于数组所占用的内存字节数,如:char a1[] = "abc"; int a2[3]; sizeof( a1 ); // 结果为4,字符末尾还存在一个NULL终止符 sizeof( a2 ); // 结果为3*4=12(依赖于int)

刚开始时把sizeof当作了求数组元素的个数,如今知道这是不对的,那么应该怎么求数组元素的个数呢Easy,通常有下面两种写法:

int c1=sizeof(a1)/sizeof(char);//总长度/单个元素的长度  char型
int c2=sizeof(a2)/sizeof(a2[0]);//总长度/第一个元素的长度 int型

与strlen区别

strlen(char*)函数求的是字符串的实际长度,直到遇到第一个'\0',然后就返回计数值,且不包括'\0'。

char aa[10];cout<

cout<所占的内存数,不是实际长度。sizeof(aa) 返回10; int a[10],sizeof(a) 返回40

1.sizeof操作符的结果类型是size_t,它在头文件中typedef为unsigned int类型。该类型保证能容纳实现所建立的最大对象的字节大小。

2.sizeof是算符,strlen是函数。

3.sizeof可以用类型做参数,strlen只能用char*做参数,且必须是以''\0''结尾的。sizeof还可以用函数做参数,比如:

short f();
printf("%d\n",sizeof(f()));

输出的结果是sizeof(short),即2。

4.数组做sizeof的参数不退化,传递给strlen就退化为指针了。

5.大部分编译程序在编译的时候就把sizeof计算过了是类型或是变量的长度这就是sizeof(x)可以用来定义数组维数的原因

char str[20]="0123456789";
int a=strlen(str);//a=10;
int b=sizeof(str);//而b=20;

6.strlen的结果要在运行的时候才能计算出来,是用来计算字符串的长度,不是类型占内存的大小。

7.sizeof后如果是类型必须加括弧,如果是变量名可以不加括弧。这是因为sizeof是个操作符不是个函数。

8.数组作为参数传给函数时传的是指针而不是数组,传递的是数组的首地址,

你可能感兴趣的:(《数据结构与算法✏️》,c语言,开发语言)