当前位置:必发365电子游戏 > 操作系统 > 而 strlen 是叁个函数
而 strlen 是叁个函数
2019-12-19

C语言中sizeof 与strlen 区别
大器晚成.本质不相同
 
sizeof 和strlen 有本质上的界别。sizeof 是C 语言的大器晚成种单目运算符,如++、--等,而不是函数,sizeof 的预先级为2 级,比/、% 等3 级运算符优先级高,sizeof
以字节的样式提交操作数的仓库储存空间的朗朗上口。而 strlen 是叁个函数,是由 C 语言
的标准库提供的。strlen 总结的  是字符串的长短。
 
二.应用分别
 
1.sizeof
 
sizeof 的操作数能够是数据类型、函数、变量,表达式使用办法为:
 
(1)数据类型
 
sizeof  (type )
 
诸如大家要总计三个int 型数据的蕴藏空间能够用: sizeof (int)。要求潜心的是
sizeof 的操作数是数据类型时要加括号。其数值大小为该数据类型所占的仓库储存空
间的字节数。
 
(2)变量
 
sizeof(变量名)
 
即便定义 int a  ,可以使用 sizeof  (a )总括a 变量攻陷的囤积空间。具体尺寸
与a 的品种有关。
 
静心:由于sizeof 是操作符sizeof a或sizeof  (a )都能够。(能够不行使括号),
只要操作数是数组名则交由数组所攻陷内存的字节数。假使数组名做函数的参数
传送时落后为指针。
 
(3)表达式
 
sizeof  (表达式)
 
sizeof 能够对三个表明式求值,编写翻译器依听新闻表达式的结尾结出类型来明确大小,
日常不会对表明式实行测算。举个例子:sizeof(1+1.5)
 
(4)函数调用
                  
 
sizeof(函数名())
 
sizeof 也能够对贰个函数调用求值,其结果是函数再次回到类型的大小,函数并不会
被调用,举个例子来讲定义如下函数:
 
int myprint ()
{
    printf(“hellon” );
    return 0;
}
 
int main()
{
  printf(“%d”,sizeof(mypaint()));
  return 0;
}
结果只打印函数重回类型的sizeof 值,并从未打字与印刷hello表明函数myprint并从未
调用。
 
C99 典型规定,函数、无法鲜明项指标表明式以致位域(bit-田野先生)成员不可能被
算算sizeof 值,即上面这个写法都以大谬不然的:
如:sizeof(myprint)(注意 sizeof(myprint()是足以的))
照旧sizeof 叁个void 再次来到类型的函数如:
void foo () { }
sizeof( foo () );
       以至位域:
struct S
{
unsigned int f1 : 1;
unsigned int f2 : 5;
unsigned int f3 : 12;
};
sizeof( S.f1 );
 
2.strlen
 
strlen 的采纳则不像 sizeof 那么附近,strlen 的参数必需是char * 的指针,如果用
strlen 计算数据类型 strlen(int)这种用法是不当的。strlen 的测算必需依靠字符
队列中的’’ 字符,strlen  就是经过推断是还是不是遇到’’ 来推断字符连串是还是不是终止
的。
它的猜想原理相仿于上面包车型大巴两条语句
while(*p!=’’)
      length++
 
strlen 的用法:分为以下三种参数
 
(1)char *  指针
必发365电子游戏,        
strlen(指针名)
 
意气风发旦参数是指针则总结该指针指向字符种类的尺寸。(以’’ 作为剖断标识)举个例子:
 
定义char *p=“hello world”;strlen(p)=11,而 sizeof  (p)=4。能够看出 strlen
算算的是指针指向的字符串的长度而sizeof 总括的是指针本人所攻下的内部存款和储蓄器空
间的轻重。
 
(2)数组
 
strlen(数组名)
 
生龙活虎旦参数是数组的话,实际传递的是多少个指南针,strlen 会遵照地方管理指针的模
式管理该数组。
 
大家能够看上边的事例:
          
char a[]=”hh”;
            strlen(a);
 
很扎眼strlen 的结果是2。不过假如数组是这样赋值的吗?
          
char a[]={‘h’,’h’};
            strlen(a);
 
那正是说以往strlen(a )的结果又是有一点吗?这几个数就不必然了,原因是 strlen 会去
计算a 地址开始的字符串的尺寸,由于前生龙活虎种赋值格局会将hh以字  符串的方式
赋值给数组会将字符串甘休符’’ 一起赋值,当时strlen 就能检讨到甘休符停止
算算,而第三种复值方式是以单个字符的样式赋值未有终止  符’’, 此时大家用
sizeof 获得的结果是正规的,而用 strlen 由于找不到甘休符,会持续的总括直到
找到甘休符停止。所以这么些数是不分明.


One example

 

#define PATH_TMP             "12345"

static void test_sizeof_strlen() {

    char *msg = "12345";
    printf("sizeof(msg)---%dn" , sizeof(msg));
    printf("strlen(msg)---%dn" , strlen(msg));

    char array[] = "12345";
    printf("sizeof(array)---%dn" , sizeof(array));
    printf("strlen(array)---%dn" , strlen(array));

    printf("sizeof(PATH_TMP)---%dn" , sizeof(PATH_TMP));
    printf("strlen(PATH_TMP)---%dn" , strlen(PATH_TMP));

}

The output result:

sizeof(msg)---4
strlen(msg)---5
sizeof(array)---6
strlen(array)---5
sizeof(PATH_TMP)---6
strlen(PATH_TMP)---5

 

 ------------------------------------------------------------------------------------------------------------------------

一、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的结果(以下结果都是在Linux v2.6 gcc v4拿走卡塔尔(قطر‎
  sizeof操作符的结果类型是size_t

它在头文件中定义为: typedef unsigned int size_t;

该类型保险能包容实现所创设的最大指标的字节大小.
  1、ANSI C正式显著字符类型为1字节。  sizeof(char卡塔尔(قطر‎ = 1;

sizeof(unsigned char) = 1;

sizeof(signed char卡塔尔国 = 1;      2、别的类别在ANSI C中从不现实规定,大小注重于实现。

  sizeof(int) = 4;

sizeof(unsigned int) = 4;

sizeof(short int) = 2;

sizeof(unsigned short) = 2;

sizeof(long int) = 4;

sizeof(unsigned long) = 4;

sizeof(float) = 4;

sizeof(double) = 8;

sizeof(long double) = 12;

  3、当操作数是指针时,sizeof注重于编写翻译器。

 

Microsoft C/C++7.0中,near类指针字节数为2,far、huge类指针字节数为4。

诚如Unix/Linux的指针字节数为4。 

例如: char *p; //Linux中

sizeof(p) = 4;
  4、当操作数具备数组类型时,其结果是数组的总字节数。

 

例如: char a[5];

int b[5];

sizeof(a) = 5;

sizeof(b) = 20;

 

5、当操作数是绘身绘色的字符串可能数值时,会遵照实际的门类举行对应转变。

 

诸如: sizeof(8卡塔尔(قطر‎ = 4; //自动转变为int类型

sizeof(8.8卡塔尔国 = 8; //自动转变为double类型,注意,不是float类型

sizeof("ab"卡塔尔国 = 3 //自动转变为数组类型,

//长度是4,不是3,因为加上了最终的'n'符

//有资料说,会自行转接为指针类型(Linux为4卡塔尔(قطر‎

//大概和操作系统与编写翻译器有涉嫌

  6、当操作数是五头项目时,sizeof是其最大字节成员的字节数。

当操作数是布局类型时,sizeof是其成员类型的总字节数,包涵补充字节在内。 

 

或许让大家拿例子来讲话:

union u{ //对union来说

char c;

double d;

}u;

sizeof(u) = max(sizeof(c),sizeof(d)) = sizeof(1,8) = 8;

  struct a{ //对struct来说

char b; 

double x;

}a;   在Linux上: sizeof(a) = 12;

而貌似sizeof(char卡塔尔(英语:State of Qatar) + sizeof(double卡塔尔 = 9;   那是因为编写翻译器在设想对齐难点时,在组织中插入空位以调节各成员对象的地点对齐。

但只要全对齐的话,sizeof(a卡塔尔 = 16, 那是因为b被内置偏移量为0的地址,占1个字节;

在存放x时,double类型长度为8,须求停放能被8整除的偏移量上,当时要求补7个空字节,

直达8个,那时偏移量为8,放上x后长度为16。

在那例中,全数的协会成员都要放在被4整除的地方(Linux的寄放方式卡塔尔国,这里补3个字节,所以为12。
  7、当操作数是函数中的数组形参或函数类型的形参:

 

sizeof给出其指针的深浅,Linux中值为4。
四、sizeof与别的操作符的关联
  sizeof的事情发生前级为2级,比/、%等3级运算符优先级高。

它可以与别的操作符一同构成表明式:

例如: int i = 10;

i * sizeof(int);

五、sizeof的首要用场
  1、首要用处是与仓库储存分配和I/O系统那样的例程举行通讯。

 

例如: void *malloc(size_t size);    size_t fread(void *ptr, size_t size, size_t nmemb, FILE * stream); 
  2、另一个的首要用项是总计数组桐月素的个数。

 

例如: void *memset(void *s, int c, sizeof(s)); 

 


sizeof和strlen的区别

例1:char ss[100]=”0123456789”;

             Sizeof(ss卡塔尔(英语:State of Qatar)结果为100,ss表示在内存中预分配的尺寸,100*1;

             Strlent(ss卡塔尔国结果为10,它的中间得以实现是用一个循环总计字符串的长短,直到””为止。

例2:int ss[100]=”0123456789”;

             Sizeof(ss卡塔尔结果为400,ss表示在内部存款和储蓄器中的大小,100*4;

             Strlen(ss卡塔尔国错误,strlen的参数只可以是char*而 strlen 是叁个函数。,且必需是以””结尾的。

总结sizeof和strlen的区别

⒈sizeof操作符的结果类型是size_t,它在头文件中的typedef为unsigned int 类型。该项目有限辅助能包容完成所创建的最大指标的字节大小。

⒉sizeof是运算符,strlen是函数。

⒊sizeof能够用场目做参数,strlen只可以用char*做参数,且必需是以””结尾的。sizeof还是能够用函数做参数,例如:            short f(卡塔尔;          

printf(“%dn”,sizeof(f()));

出口的结果是sizeof(short卡塔尔(قطر‎,即2。

⒋数组做sizeof的参数不掉队,传递给strlen就落伍为指针。

⒌大多数编写翻译程序在编写翻译的时候就把sizeof计算过了,是种类恐怕变量的长度。那正是sizeof(x卡塔尔国能够用来定义数组位数的由来。

                                                                        char str[20]=”0123456789”;

                                                                        int a=strlen(satr);            //a=10;

                                                                        int b=sizeof(str);            //b=20;

⒍strlen的结果要在运作的时候能力计算出来,用来总计字符串的长度,实际不是类别占内部存款和储蓄器的分寸。

⒎sizeof后只假如连串必需加括号,假使是变量名能够不加括号。那是因为sizeof是个操作符并不是函数。

⒏当使用八个协会类型或变量时,sizeof再次回到实际的轻重。当使用风华正茂静态的空间数组时,sizeof重临全体数组的尺码。Sizeof操作符不能够回来被动态分配的数组或外部的数组的尺码。

⒐数组作为参数字传送给函数时传得是指针并不是数组,传递的是数组的首地址。在C++里传递数组永久都以传递指向数组首元素的指针,编写翻译器不知底数组的大大小小,假若想在函数内精晓数组的分寸要求在函数里面用memcpy将数组复制出来,长度由另一个形参传禁区。

⒑总括布局变量的大小就必需探究数量对其难题。

⒒sizeof操作符不可能用来函数类型,不完全类型或位字段。不完全类型指具有未知存款和储蓄大小数据的数据类型,如茫然不解存款和储蓄大小的数组类型,未知内容的协会或合伙项目,void类型等。

 

Sizeof的应用项所

第生龙活虎要显著sizeof不是函数,亦不是一元运算符,它是个像样宏定义的新鲜首要性字,sizeof(卡塔尔(英语:State of Qatar)。括号内的内容在编写翻译进度中是不被编写翻译的,而是被替代类型,如int a=8;  sizeof(a卡塔尔(قطر‎。在编写翻译进度中,不管a的值是如何,知识被替换到类型sizeof(int卡塔尔,结果为4。假如sizeof(a=6卡塔尔(قطر‎呢?也是同样地调换到a的项目,然而要留意,因为a=6是不被编写翻译的,所以进行sizeof(a=6卡塔尔后,a的值依旧8,是不改变的。

①     sizeof操作符的二个首要用项是与仓库储存分配和I/O系统那样的例程进行通信。举个例子:

void *malloc(sizex_t size),

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

②     用它能够看看某体系型的对象在内部存款和储蓄器中所占的单元。比方:

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

③在动态分配一目的时,可以让系统理解要分配多少内部存储器。

④便于一些种类的扩展。在Windows中有广大布局类型就有三个专门的字段用来寄放在该项目标字节大小。

⑤由于操作数的字节数在贯彻时可能现身转移,提出在关系操作数字节大小时用sizeof取代常量总计。

⑥如果操作数是函数中的数组形参或函数类型的形参,sizeof给出其指针的高低。

 

结论:

①     unsigned影响的知识最高位bit的意思(正/负卡塔尔,数据长度是不会被转移的,所以:

sizeof(unsigned int) == sizeof(int);

②     自定义类型的sizeof取值等同于它的类型原形。如:

typedef short WORD;

sizeof(short) == sizeof(WORD);

③     对函数使用sizeof,在编写翻译阶段会被函数重临值的花色替代。如:

int f1() {return 0;}

cout<<sizeof(f1(卡塔尔国卡塔尔<<endl;     //f1(卡塔尔(قطر‎再次回到值为int,由此会被感到是int。

④     只假设指针,大小正是4。如:

cout<<sizeof(string*)<<endl; //4

⑤数组的高低是各维数的乘积×数组成分的高低。

上一篇:没有了
下一篇:没有了