sizeof()与strlen()“大比拼”

1、基本定义

sizeof():

首先sizeof()在c语言中是一种单目运算符,在编译的时候就进行计算,它的作用是用来计算出对象所占的字节数,通常用来查看变量、数组或结构体等所占的字节个数。其中对象的字节个数与具体的操作平台有直接的关系。

括号里的参数可以是数组、指针、类型、对象、函数等。

而且它不能用来返回动态分配的内存空间的大小。实际上,用sizeof来返回类型以及静态分配的对象、结构或数组所占的空间,返回值跟对象、结构、数组所存储的内容是没有关系。具体语法及举例在后面附着。

strlen():

strlen()是函数,要在运行时才计算,它的作用返回字符串的长度。该字符串可以是自己定义的,也可能是内存中随机的,该函数实际完成的功能是从代表该字符串的第一个地址开始遍历,直到遇到结束符NULL。返回的长度大小不包括NULL。

括号里的参数必须是字符型指针(char *)。当数组名作为参数传入时,实际上数组就退化成指针了。

2、具体的语法及举例

sizeof()有三种语法形式,如下:
1) sizeof ( object ) ;     // sizeof( 对象 ) ;   sizeof ( i );

2) sizeof  ( type_name );    //   sizeof( 类型 ) ;   sizeof ( int );    sizeof   int ;

3) sizeof object;     // sizeof 对象 ;  sizeof  i ;

char * str1 = "jl"; 解析:str1在这里是指针,在这里不是指字符串占的空间,而是一个字符型指针所占的空间,指针占4个字节。

 sizeof (str1) = 4.  =>  sizeof (str1) =sizeof (char *)=4.

char  str2[ ]= "jl"; 解析:str2是字符型数组,对于数组而言,返回的是这个数组所占的总的空间,数组的屁股后面还跟有'\0'。

sizeof (str2) = 3. => sizeof (str2) => { j , l , \0}=3.

char  str3 [ 8 ]= {'j',}; 解析:str3是 定义了长度 为8 的数组 。因此 sizeof (str3) = 8.

char  ss[ ] = "012345" ; 解析:这个类似于第二种情况。sizeof ( ss )= 7 => sizeof ( ss )= {0 , 1 ,2, 3, 4, 5, \0}=7.

在这里,重点提出对于指针,sizeof()返回的是该指针所占的空间,一般为4个字节。但是对于数组而言,返回数组所有元素占的总空间,(包括'\0').特别地对于结构体而言,sizeof()要满足字节对齐。字节对齐就是结构体的总大小为结构体最宽基本类型成员大小的整数倍。而且空结构体的sizeof()为1,不是0.

对于strlen()不区分是数组还是指针,就读到\0为止返回长度。而且strlen是不把\0计入字符串的长度的.

strlen()源代码如下:

#include<stdio.h>

方法一、利用中间变量(计数)

int strlen (const char * str)
{
int i=0;
while((str[i])!='\0')
{
++i;
}
return i;
}
void main()
{
char * s="hello";
printf("%d \n",strlen(s));

}

方法二、不借助计数变量

int strlen (const char * str)
{
if( NULL == str) return NULL;
else 
return (*str!='\0') ? (1+strlen(str+1)) : 0;
}
void main()
{
char * s="hello";
printf("%d \n",strlen(s));

}

方法三、利用指针的加减法

int strlen ( char * str)
{
char * p = str;
while(*p!='\0')

{p++;}

return p - str ;
}
void main()
{
char * s="hello";
printf("%d \n",strlen(s));
}

欢迎读者批评指正。

猜你喜欢

转载自blog.csdn.net/qq_40303781/article/details/80245030