下面我们来区分一次sizeof和strlen。
1.sizeof
sizeof是用来求类型对象所占内存空间大小的,他的单位是字节
举些栗子:
1.1求整型的所占空间大小:
int p = 0;
printf("%d", sizeof(p));
结果如下:
整型的存储是占据四个字节的,因此结果输出4
1.2求字符串
我们知道,C语言中没有一种专门的数据类型来存储字符串。那么掌这里我们选择使用字符数组来进行存储,而字符数组也有两种存储方式。
第一种是将字符串直接整体存储,如acX。
第二种是将每个字符分别存储,如acY。
char acX[] = "abcdefg";
char acY[] = { 'a','b','c','d','e','f','g' };
printf("sizeof:%d\n", sizeof(acX));
printf("sizeof:%d\n", sizeof(acY));
结果如下:
我们知道在ASCALL码表中,一个英文字符占一个字节。而字符串在存储中末尾会自动加上一个转义字符"/0",这个/0是隐藏的,他是字符串的结束标志。
那么当我们使用sizeof来求acX的大小时,便会加上末尾的"/0",求acY的大小时,由于是每个字符每个字符的存储,因此没有/0的存在,所以下面结果中acX比acY多1.
在内存中的表现如下:
acX:
acY:
1.3求数组大小
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
int m = sizeof(arr);
int n = sizeof(arr[0]);
printf("m = %d n = %d", m, n);
以下是运行结果:
整型的存储是占据四个字节的,sizeof(arr)求出的就是数组中所有元素所占的内存空间大小,而sizeof(arr[0])由于我们确定了元素arr[0],因此求的就是数组中一个元素所占空间的大小。
那么我们可以通过这两个的比值来求出数组中元素的个数。
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
int o = sizeof(arr) / sizeof(arr[0]);
printf("该数组大小为:%d\n", o);
结果如下:
2.strlen
strlen是用来求字符串的长度的,当遇到“\0"时我们就要停止读取,此时“\0"前字符的个数就是字符串的长度。
注意:
(1)这里的"/0"是停止标志,遇到后就停止读取,它不算一个字符。
(2)使用strlen时需要包含头文件string.h
下面来一些栗子:
2.1
char acX[] = "abcdefg";
char acY[] = { 'a','b','c','d','e','f','g' };
printf("strlen:%d\n", strlen(acX));
printf("strlen:%d\n", strlen(acY));
这里两个值差的较多,原因是strlen函数结束的标志是遇到"/0",它只有在遇到想遇见的才会停止。
在acX末尾处由于自动添加了"/0",因此会读取到g后面就会停止。
而acY由于是一个字符一个字符的存储,所以末尾并没有"/0",因此它就会继续向下走,寻找它的"/0",直到碰到"/0"才会停止,所以显示的42是它在遍历了42个字符才遇到的"/0"。
由于编译器等原因,这个值可能每个人和每个人是不一样的。
以上是本次所有内容,谢谢观看。