C中的sizeof与strlen函数部分注解
本内容供复习参考用
sizeof
sizeof是用来查询当前变量在内存中所占字节数的一个运算符,可以对常见的变量进行字节计算,如下:
#include <stdio.h>
#include <string.h>
int main()
{
int a ;
float b;
char c;
double d;
printf("sizeof=%d\n",sizeof (a));//4字节
printf("sizeof=%d\n",sizeof (b));//4字节
printf("sizeof=%d\n",sizeof (c));//1字节
printf("sizeof=%d\n",sizeof (d));//8字节
return 0 ;
}
strlen
strlen是用来查询字符串中含有字符的数量,从传递过来的地址开始计算,一直到 ‘/0’。
请注意一个前提,字符串成立的条件是末尾必须有空字符也就是 ‘/0’。
#include <stdio.h>
#include <string.h>
int main()
{
char arr[5] ="hello"; //占用满了,无位置存放空字符,不是字符串
char arrx[6] ="hello"; //hello'/0' 实际
char arrxx[7] = "hello"; //hello'/0'+随机数 实际
char an[] = "hello";//hello'/0' 实际
for(int i = 0;i<sizeof(arr);i++) //104101108108111
printf("%d",arr[i]);
printf("\n");
for(int i = 0;i<sizeof(arrx);i++) //1041011081081110
printf("%d",arrx[i]);
printf("\n");
for(int i = 0;i<sizeof(arrxx);i++) //10410110810811100
printf("%d",arrxx[i]);
printf("\n");
for(int i = 0;i<sizeof(an);i++) //1041011081081110
printf("%d",an[i]);
printf("\n");
return 0 ;
}
从上面的代码段验证中,可以得知,C语言在构造字符串时,会隐式的调用一个空字符补充到字符串结尾处。因此在使用strlen时,查询的字符串长度,就是从当前传入的地址,一直到空字符前。代码如下:
#include <stdio.h>
#include <string.h>
int main()
{
char arr[] ="hello"; // 实际存储为:h e l l o '/0'
printf("strlen==%d\n",strlen(arr)); //传入arr[0]
//从arr[0]计数到空字符'/0'前
printf("strlen==%d\n",strlen(&arr[3])); //arr[3]
printf("strlen==%d\n",strlen(&arr[sizeof(arr)-1])); //arr[5]
//结果如下:5 2 0
return 0 ;
}
从这个例子长得sizeof(arr)-1得到arr[5]也能说明上述构造字符串中仍然是隐式创建了一个空字符。
两者作用在字符串时的区别
#include <stdio.h>
#include <string.h>
int main()
{
char arr[6] ="hello"; // 实际存储为:h e l l o '/0'
printf("strlen==%d\n",strlen(arr));//5
printf("sizeof==%d\n",sizeof(arr));//6
}
sizeof将对该变量所占用字节数进行输出,而strlen的功能则是计算从传入地址到空字符间的字符数量。
sizeof对其他变量进行计算
通常采用sizeof(主体)/sizeof(变量)来获得长度,如整型数组长度计算如下:
#include <stdio.h>
int main()
{
int arr[] ={1,2,3,54,65,7,9,5}; // 8wei
int len = sizeof(arr)/sizeof(int);
printf("sizeofarr==%d\n",sizeof(arr));//32
printf("sizeofint==%d\n",sizeof(int));//4
printf("len==%d\n",len);//8
return 0;
}