c语言long size,C语言之sizeof解释(一)

日期: 2024-11-01 14:02:54|浏览: 12|编号: 106723

友情提醒:信息内容由网友发布,请自鉴内容实用性。

c语言long size,C语言之sizeof解释(一)

一、定义:

何放神是C/C++中的运算符()。简单来说,它的作用就是返回一个对象或者类型占用的内存字节数。其返回值类型在头文件.h中定义。这是一个取决于编译系统的值,通常定义为

整数;

2.语法:

有以下三种语法形式:

1) ( ); // (目的);

2) ( ); // (类型);

3); // 目的;

整数我;

( 我 ); // 好的

我; //好的

(整数); //好的

整数; // 错误

既然写法3可以用写法1代替,为了统一形式,减轻我们大脑的负担,就别想第三种写法了!

事实上,计算对象的大小也转化为对象类型的计算,也就是说,同一类型的不同对象的值是一致的。这里,对象可以进一步扩展为表达式,即可以对表达式求值。编译器根据表达式的最终结果类型来确定大小,并且通常不计算表达式。喜欢:

(2);//2的类型是int,所以等价于(int);

(2+3.14); //

3.14的类型是,2也会提升为类型,所以等价

在( );

也可以评估函数调用。结果是函数返回类型的大小。该函数未被调用。让我们看一个完整的例子:

char foo()

("foo() 已经 .\n");

'一个';

int main()

sz = ( foo() ); // foo()的返回值类型是char,所以sz = (

char ), foo() 将不会被调用

("( foo() ) = %d\n", sz);

C99标准规定函数、未确定类型的表达式、位域成员不能求值,即以下写法是不正确的:

(foo); // 错误

无效 foo2() { }

( foo2() );// 错误

S

整数 f1 : 1;

整数 f2 : 5;

整数 f3 : 12;

};

(S.f1);//错误

3. 恒常性

计算发生在编译时,因此可以用作常量表达式,如:char

ary[ ( int ) * 10 ]; // 好的

最新的C99标准规定计算也可以在运行时进行。例如下面的程序在Dev-C++中可以正确执行:

整数 n;

n = 10; // n 动态赋值

字符[n]; // C99也支持动态定义数组

("%d\n", (ary)); // 好的。输出10

但它无法在未完全实现 C99 标准的编译器中运行。上面的代码在VC6中无法编译。所以我们最好认为它是在编译时执行的,这样就不会产生错误,也让程序的可移植性更强。

4. 基本数据类型

这里的基本数据类型是指short、int、long、float等简单的内置数据类型。由于它们都与系统相关,因此在不同的系统中其值可能会有所不同。这一定要引起我们的重视,尽量不要在这方面给自己程序的移植带来麻烦。一般情况下,在32位编译环境中,(int)的值为4。

5. 指针变量

如果学过数据结构,应该知道指针是一个非常重要的概念。它们记录另一个对象的地址。既然是用来存储地址的,那么它当然等于计算机内部地址总线的宽度。因此,在32位计算机中,指针变量的返回值必须是4(注意结果以字节为单位)。可以预期,在未来的64位系统中,指针变量的结果将是8。

字符* pc = "abc";

整数*pi;

*附注;

字符** ppc = &pc;

void (*pf)();//函数指针

(个人电脑); //结果是4

(圆周率); //结果是4

(ps); //结果是4

(点击付费); //结果是4

(pf);//结果为4

指针变量的值与指针所指向的对象无关。正是因为所有指针变量占用相同的内存大小,MFC消息处理函数才可以使用两个参数来传递各种复杂的消息结构(使用指针结构)。体指针)。

6. 数组

数组的值等于数组占用的内存字节数,如:

字符 a1[] = "abc";

int a2[3];

(a1); // 结果为4,字符末尾有NULL终止符

(a2); // 结果是3*4=12(取决于int)

有的朋友一开始以为是求数组元素的个数。现在,你应该知道这是错误的。那么应该如何找到数组元素的数量呢?很简单,通常有两种写法:

int c1 = ( a1 ) / ( char ); //

总长度/单个元素长度

int c2 = ( a1 ) / ( a1[0] ); //

总长度/第一个元素的长度

写到这里,我想问一下,下面c3和c4的值应该是多少?

无效 foo3(char a3[3])

int c3 = ( a3 );

无效 foo4(char a4[])

int c4 = ( a4 );

也许当您尝试回答 c4 的值时,您意识到 c3 是错误的。是的,c3!=3。这里函数参数a3不再是数组类型,而是转化为指针,相当于char*

a3、为什么仔细想一想,就不难理解了。当我们调用函数foo1时,程序会在堆栈上分配一个大小为3的数组吗?不!数组是“按地址传递”,调用者只需要传递实参的地址即可,所以a3自然是指针类型(char*),而c3的值为4。

提醒:请联系我时一定说明是从浚耀商务生活网上看到的!