解析C语言中的sizeof.net

| 收藏本文 下载本文 作者:阳叔学

以下是小编为大家准备的解析C语言中的sizeof.net(共含7篇),希望对大家有帮助。同时,但愿您也能像本文投稿人“阳叔学”一样,积极向本站投稿分享好文章。

解析C语言中的sizeof.net

篇1:解析C语言中的sizeof.net

一、sizeof的概念 sizeof是C语言的一种单目操作符,如C语言的其他操作符++、--等,它并不是函数。sizeof操作符以字节形式给出了其操作数的存储大

一、sizeof的概念

sizeof是C语言的一种单目操作符,如C语言的其他操作符++、--等。它并不是函数。sizeof操作符以字节形式给出了其操作数的存储大小。操作数可以是一个表达式或括在括号内的类型名。操作数的存储大小由操作数的类型决定。

二、sizeof的使用方法

1、用于数据类型

sizeof使用形式:sizeof(type)

数据类型必须用括号括住。如sizeof(int)。

2、用于变量

sizeof使用形式:sizeof(var_name)或sizeof var_name

变量名可以不用括号括住。如sizeof (var_name),sizeof var_name等都是正确形式。带括号的用法更普遍,大多数程序员采用这种形式。

注意:sizeof操作符不能用于函数类型,不完全类型或位字段。不完全类型指具有未知存储大小的数据类型,如未知存储大小的数组类型、未知内容的结构或联合类型、void类型等。

如sizeof(max)若此时变量max定义为int max,sizeof(char_v) 若此时char_v定义为char char_v [MAX]且MAX未知,sizeof(void)都不是正确形式。

三、sizeof的结果

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

1、若操作数具有类型char、unsigned char或signed char,其结果等于1。

ANSI C正式规定字符类型为1字节。

2、int、unsigned int 、short int、unsigned short 、long int 、unsigned long 、float、double、long double类型的sizeof 在ANSI C中没有具体规定,大小依赖于实现,一般可能分别为2、2、2、2、4、4、4、8、10,

3、当操作数是指针时,sizeof依赖于编译器。例如Microsoft C/C++7.0中,near类指针字节数为2,far、huge类指针字节数为4。一般Unix的指针字节数为4。

4、当操作数具有数组类型时,其结果是数组的总字节数。

5、联合类型操作数的sizeof是其最大字节成员的字节数。结构类型操作数的sizeof是这种类型对象的总字节数,包括任何垫补在内。

让我们看如下结构:

struct  a;

在某些机器上sizeof(a)=12,而一般sizeof(char)+ sizeof(double)=9。

这是因为编译器在考虑对齐问题时,在结构中插入空位以控制各成员对象的地址对齐。如double类型的结构成员x要放在被4整除的地址。

6、如果操作数是函数中的数组形参或函数类型的形参,sizeof给出其指针的大小。

四、sizeof与其他操作符的关系

sizeof的优先级为2级,比/、%等3级运算符优先级高。它可以与其他操作符一起组成表达式。如i*sizeof(int);其中i为int类型变量。

五、sizeof的主要用途

1、sizeof操作符的一个主要用途是与存储分配和I/O系统那样的例程进行通信。例如:

void *malloc(size_t size),

size_t fread(void * ptr,size_t size,size_t nmemb,FILE * stream)。

2、sizeof的另一个的主要用途是计算数组中元素的个数。例如:

void * memset(void * s,int c,sizeof(s))。

六、建议

由于操作数的字节数在实现时可能出现变化,建议在涉及到操作数字节大小时用ziseof来代替常量计算。

原文转自:www.ltesting.net

篇2:C语言中的const

C语言的中的const,代表的含义是”不可改变的变量“,或者可以成为”伪常量“

C++中 const,被称为”一个有类型描述的常量“

const int liv_num = 10; liv_num = 18; //error 因为liv_num 被const修饰不可被直接赋值

那么,我为什么说是”伪常量“?

我们知道在c中给变量赋值,有两种方式:一种就是直接赋值;一种是间接赋值,

对于第一种方式,我们已经验证是不可以的。那么,使用间接赋值是否可以实现对liv_num的值得改变呢?

注意:一定要是.c的文件,如果使用的是.cpp的话,不会出现效果,因为c++中 const,被称为”一个有类型描述的常量“

#include#includeint main(){ //定义一个常量 const int liv_num = 10; //liv_num = 18; //error 因为liv_num 被const修饰不可被直接赋值 //定义一个指针指向常量 const int *pliv_num = &liv_num; //对指向常量的指针进行转换 int * pNum = (int *)pliv_num; //进行赋值 *pNum = 20; printf(liv_num = %d , liv_num);//结果为:20system(pause); return 0;}

通过以上,我们就方向 在c中 const 是 ”伪常量“, 那么也说明一个问题,const是保存在 ”栈“ 中的, 如果想验证,可以使用debug,观察内存,再此不在叙述,

篇3:c语言中的1是什么意思

编译器

GCC,GNU组织开发的开源免费的编译器

MinGW,Windows操作系统下的GCC

Clang,开源的BSD协议的基于LLVM的`编译器

Visual C++:: cl.exe,Microsoft VC++自带的编译器

集成开发环境(IDE)

CodeBlocks,开源免费的C/C++ IDE

CodeLite,开源、跨平台的C/C++集成开发环境

Orwell Dev-C++,可移植的C/C++IDE

C-Free

Light Table

Visual Stdio系列

Hello World

篇4:c语言中static用法总结

一、c程序存储空间布局

C程序一直由下列部分组成:

正文段——CPU执行的机器指令部分;一个程序只有一个副本;只读,防止程序由于意外事故而修改自身指令;

初始化数据段(数据段)——在程序中所有赋了初值的全局变量,存放在这里,

非初始化数据段(bss段)——在程序中没有初始化的全局变量;内核将此段初始化为0。

栈——增长方向:自顶向下增长;自动变量以及每次函数调用时所需要保存的信息(返回地址;环境信息)。

堆——动态存储分。

|-----------|

|          |

|-----------|

|    栈   |

|-----------|

|    |     |

|   \|/   |

|          |

|          |

|   /|\   |

|    |     |

|-----------|

|    堆   |

|-----------|

| 未初始化|

|-----------|

| 初始化 |

|-----------|

| 正文段 |

|-----------|

二、 面向过程程序设计中的static

1. 全局静态变量

在全局变量之前加上关键字static,全局变量就被定义成为一个全局静态变量。

内存中的位置:静态存储区(静态存储区在整个程序运行期间都存在)

初始化:未经初始化的全局静态变量会被程序自动初始化为0(自动对象的值是任意的,除非他被显示初始化)

作用域:全局静态变量在声明他的文件之外是不可见的。准确地讲从定义之处开始到文件结尾。

看下面关于作用域的程序:

查看原始代码

//teststatic1.c

voiddisplay;

externintn;

intmain()

{

n=20;

printf(“%d\n”,n);

display();

return0;

}

查看原始代码

//teststatic2.c

staticintn;//定义全局静态变量,自动初始化为0,仅在本文件中可见

voiddisplay()

{

n++;

printf(“%d\n”,n);

}

文件分别编译通过,但link的时候teststatic1.c中的变量n找不到定义,产生错误。

定义全局静态变量的好处:

<1>不会被其他文件所访问,修改

<2>其他文件中可以使用相同名字的变量,不会发生冲突。

2. 局部静态变量

在局部变量之前加上关键字static,局部变量就被定义成为一个局部静态变量。

内存中的位置:静态存储区

初始化:未经初始化的全局静态变量会被程序自动初始化为0(自动对象的值是任意的,除非他被显示初始化)

作用域:作用域仍为局部作用域,当定义它的函数或者语句块结束的时候,作用域随之结束,

注:当static用来修饰局部变量的时候,它就改变了局部变量的存储位置,从原来的栈中存放改为静态存储区。但是局部静态变量在离开作用域之后,并没有被销毁,而是仍然驻留在内存当中,直到程序结束,只不过我们不能再对他进行访问。

当static用来修饰全局变量的时候,它就改变了全局变量的作用域(在声明他的文件之外是不可见的),但是没有改变它的存放位置,还是在静态存储区中。

3. 静态函数

在函数的返回类型前加上关键字static,函数就被定义成为静态函数。

函数的定义和声明默认情况下是extern的,但静态函数只是在声明他的文件当中可见,不能被其他文件所用。

例如:

查看原始代码

//teststatic1.c

voiddisplay();

staticvoidstaticdis();

intmain()

{

display();

staticdis();

renturn0;

}

查看原始代码

//teststatic2.c

voiddisplay()

{

staticdis();

printf(“display() has been called\n”);

}

staticvoidstaticdis()

{

printf(“staticDis() has been called\n”);

}

文件分别编译通过,但是连接的时候找不到函数staticdis()的定义,产生错误。

定义静态函数的好处:

<1> 其他文件中可以定义相同名字的函数,不会发生冲突

<2> 静态函数不能被其他文件所用。

存储说明符auto,register,extern,static,对应两种存储期:自动存储期和静态存储期。

auto和register对应自动存储期。具有自动存储期的变量在进入声明该变量的程序块时被建立,它在该程序块活动时存在,退出该程序块时撤销。

关键字extern和static用来说明具有静态存储期的变量和函数。用static声明的局部变量具有静态存储持续期(static storage duration),或静态范围(static extent)。虽然他的值在函数调用之间保持有效,但是其名字的可视性仍限制在其局部域内。静态局部对象在程序执行到该对象的声明处时被首次初始化。

由于static变量的以上特性,可实现一些特定功能。

1. 统计次数功能

声明函数的一个局部变量,并设为static类型,作为一个计数器,这样函数每次被调用的时候就可以进行计数。这是统计函数被调用次数的最好的办法,因为这个变量是和函数息息相关的,而函数可能在多个不同的地方被调用,所以从调用者的角度来统计比较困难。代码如下:

查看原始代码

voidcount();

intmain()

{

inti;

for(i=1; i<=3; i++)

count();

return0;

}

voidcount()

{

staticnum=0;

num++;

printf(“ I have been called %d”,num,“times\n”);

}

输出结果为:

I have been called 1 times.

C语言程序可以看成由一系列外部对象构成,这些外部对象可能是变量或函数。而内部变量是指定义在函数内部的函数参数及变量。外部变量定义在函数之外,因此可以在许多函数中使用。由于C语言不允许在一个函数中定义其它函数,因此函数本身只能是“外部的”。

由于C语言代码是以文件为单位来组织的,在一个源程序所有源文件中,一个外部变量或函数只能在某个文件中定义一次,而其它文件可以通过extern声明来访问它(定义外部变量或函数的源文件中也可以包含对该外部变量的extern声明)。

篇5:define在c语言中是什么意思

预处理命令以“#”号开头,如包含命令#include,宏定义命令#define等。一般都放在源文件的前面,它们称为预处理部分。

所谓预处理是指在进行编译之前所作的'工作。预处理是C语言的一个重要功能,它由预处理程序负责完成。当对一个源文件进行编译时,系统将自动引用预处理程序对源程序中的预处理部分作处理,处理完毕自动进入对源程序的编译。

在C或C++语言源程序中允许用一个标识符来表示一个字符串,称为“宏”。被定义为“宏”的标识符称为“宏名”。在编译预处理时,对程序中所有出现的“宏名”,都用宏定义中的字符串去代换,这称为“宏代换”或“宏展开”。宏定义是由源程序中的宏定义命令完成的。宏代换是由预处理程序自动完成的。

篇6:c语言中字符串函数的使用

#include

#include

/*

char s1[]=“I am a student”;

char s2[20]=“teacher”;

char s3[]=“student”;

int result;

char s4[20],*p;

1.串的长度

int strlen(char *str):

printf(“%d\n”,strlen(s1));//长度为14

printf(“%d\n”,strlen(s2));//长度为7

2.复制

char *strcpy(char *str1,char *str2):

strcpy(s4,s2);//把s2复制给s4

printf(“%s\n”,s4);//输出teacher

3.比较

int strcmp(char *str1,char *str2):

result=strcmp(s2,s3);

printf(“%d\n”,result);//s2>s3

4.字符串定位

char *strchr(char *str,char ch);

p=strchr(s1,'s');//p指向在s1中字符's'的位置

printf(“%s\n”,p);//输出student

5.子串查找

char *strstr(char *s1,char *s2);

p=strstr(s1,s3);//p指向在s1中字符's'的位置

printf(“%s\n”,p);//输出student

6.连接

char * strcat(char *str1,char *str2):

strcat(s2,s3);

printf(“%s\n”,s2);//输出teacherstudent

*/

void ReverseName(char *name,char *newName){

char *p;

p=strchr(name,' ');//字符定位

*p='\0';

printf(“%s\n”,name);

printf(“%s\n”,p);

strcpy(newName,p+1);//复制

printf(“--%s\n”,newName);

strcat(newName,“,”);//连接

strcat(newName,name);//连接

*p=' ';

printf(“%s\n”,name);

}

int main{

char name[]=“jie wang”,newName[30];

ReverseName(name,newName);

printf(“hello world\n”);

return 0;

}

篇7:c语言中的堆和栈的区别

堆和栈的区别

1.申请方式

(1)栈(satck):由系统自动分配,例如,声明在函数中一个局部变量int b;系统自动在栈中为b开辟空间。

(2)堆(heap):需程序员自己申请(调用malloc,realloc,calloc),并指明大小,并由程序员进行释放。容易产生memory leak.

eg:char p;

p = (char *)malloc(sizeof(char));

但是,p本身是在栈中。

2.申请大小的限制

(1)栈:在windows下栈是向底地址扩展的数据结构,是一块连续的内存区域(它的生长方向与内存的生长方向相反)。栈的大小是固定的。如果申请的空间超过栈的剩余空间时,将提示overflow。

(2)堆:堆是高地址扩展的数据结构(它的生长方向与内存的生长方向相同),是不连续的内存区域。这是由于系统使用链表来存储空闲内存地址的,自然是不连续的,而链表的遍历方向是由底地址向高地址。堆的大小受限于计算机系统中有效的虚拟内存。

3.系统响应:

(1)栈:只要栈的空间大于所申请空间,系统将为程序提供内存,否则将报异常提示栈溢出。

(2)堆:首先应该知道操作系统有一个记录空闲内存地址的链表,但系统收到程序的申请时,会遍历该链表,寻找第一个空间大于所申请空间的堆结点,然后将该结点从空闲链表中删除,并将该结点的空间分配给程序,另外,对于大多数系统,会在这块内存空间中的首地址处记录本次分配的大小,这样,代码中的free语句才能正确的释放本内存空间。另外,找到的堆结点的大小不一定正好等于申请的大小,系统会自动的将多余的那部分重新放入空闲链表中。

说明:对于堆来讲,对于堆来讲,频繁的new/delete势必会造成内存空间的不连续,从而造成大量的碎片,使程序效率降低,

对于栈来讲,则不会存在这个问题,

4.申请效率

(1)栈由系统自动分配,速度快。但程序员是无法控制的

(2)堆是由malloc分配的内存,一般速度比较慢,而且容易产生碎片,不过用起来最方便。

5.堆和栈中的存储内容

(1)栈:在函数调用时,第一个进栈的主函数中后的下一条语句的地址,然后是函数的各个参数,参数是从右往左入栈的,然后是函数中的局部变量。注:静态变量是不入栈的。

当本次函数调用结束后,局部变量先出栈,然后是参数,最后栈顶指针指向最开始存的地址,也就是主函数中的下一条指令,程序由该点继续执行。

(2)堆:一般是在堆的头部用一个字节存放堆的大小。

6.存取效率

(1)堆:char *s1=”hellow tigerjibo”;是在编译是就确定的

(2)栈:char s1[]=”hellow tigerjibo”;是在运行时赋值的;用数组比用指针速度更快一些,指针在底层汇编中需要用edx寄存器中转一下,而数组在栈上读取。

补充:

栈是机器系统提供的数据结构,计算机会在底层对栈提供支持:分配专门的寄存器存放栈的地址,压栈出栈都有专门的指令执行,这就决定了栈的效率比较高。堆则是C/C++函数库提供的,它的机制是很复杂的,例如为了分配一块内存,库函数会按照一定的算法(具体的算法可以参考数据结构/操作系统)在堆内存中搜索可用的足够大小的空间,如果没有足够大小的空间(可能是由于内存碎片太多),就有可能调用系统功能去增加程序数据段的内存空间,这样就有机会分到足够大小的内存,然后进行返回。显然,堆的效率比栈要低得多。

7.分配方式:

(1)堆都是动态分配的,没有静态分配的堆。

(2)栈有两种分配方式:静态分配和动态分配。静态分配是编译器完成的,比如局部变量的分配。动态分配由alloca函数进行分配,但是栈的动态分配和堆是不同的。它的动态分配是由编译器进行释放,无需手工实现。

C语言中函数和指针的参数传递

浅谈C语言中scanf,gets函数区别与联系

英汉语言中的“红”“白”“黑”

计算机二级C语言程序设计考点解析:程序设计基本

《z c s》课文解析(人教版一年级上册)

关于C/C++程序员应聘常见面试题深入解析

爱在无言中初中作文

爱你,只能在无言中

伊索寓言中的故事

论整体取向与个体观念在汉英语言中的投射

解析C语言中的sizeof.net(精选7篇)

欢迎下载DOC格式的解析C语言中的sizeof.net,但愿能给您带来参考作用!
推荐度: 推荐 推荐 推荐 推荐 推荐
点击下载文档 文档为doc格式
点击下载本文文档