一:sizeof(操作符)
二:strlen(库函数)
三:字符数组和字符串数组
四:数组名a和&a
一:字符数组和字符串数组
(1):字符数组跟字符串数组两者是不同的一个概念。
(2):字符数组:系统不会自动的在字符数组结束的后面一个空间加上一个NULL以表示结束。比如说char a[2]={'c','b'};这个时候字符数组的长度就是2。并且这个数组里面也没有字符数组结束的标志NULL,因此系统会往后找什么时候在字符数组的后面找到了NULL,那么系统就会认为这个字符数组才结束。这个时候系统理解的字符数组跟我们初始化的字符数组是有区别的。
char a[3]={'c','b'};像这个这个字符数组的长度是2,但是因为定义的数组长度为3,实际初始化的时候值初始化了a[0],a[1],因此系统会自动的给a[2]=NULL。
(3):字符串数组:*a="ac",a[]="ac",a[3]="ac"(注意这个不能用a[2]);像这种情况系统会自动的给“ac\0"。因此应该用3而不是2.所以字符串数组里面有隐藏的NULL。
二:sizeof
(1):sizeof因为是操作符而不是库函数,所以在使用sizeof来计算数组中元素个数的方法的时候,不需要头文件,而strlen函数需要。
(2):sizeof适用于所有求数组中元素个数的多少。
①:int float double 类型的数组。sizeof(数组名)/sizeof(类型名)。前者计算整个数组在计算机内所占的字节数,后者计算出一个这样类型的数组在计算机内所占的字节数。
②:字符数组和字符串数组。字符数组:使用sizeof时求得的是里面字符的个数。如果数组是a[3]={'a','c'}这种初始化的话,也是求得这个数组的长度,但是不是求得有效字符得个数,因为一般来说不会使用a[3](NULL)这个。
字符串数组:当使用sizeof的时候求得的是字符串数组里面元素个数加1的结果,因为还有一个隐藏的NULL在字符串数组当中。
三:strlen函数
(1):strlen函数是库函数,因此要使用头文件#include<string.h>。
(2):只能够求字符数组和字符串数组的字符长度,strlen求个数不包括NULL。
①:字符数组:对于a[2]={'a','c'}这种类型来说因为不知道字符数组后面第几个位置有NULL,因此所求得的字符长度也是不固定的。最幸运的一种情况就是在a[1]的后面就找到了NULL。要是对于a[3]={'a','c'}这种情况也就是求得是里面字符的长度(不包括NULL),而不是数组的长度。有时候字符长度跟数组长度是不一样的。
②:字符串数组:使用strlen函数,刚好求得是字符串的长度。请注意字符串长度跟数组长度是不一样的。
四:数组名a和&a
(1):数组名a只有在a单独这种情况下代表的是数组首元素的地址
(2):&a这个代表的是整个数组的地址,因此&a+1,代表的是整个数组之后的第一个地址。