1例子1 sizeof之数组
转载:https://www.cnblogs.com/Waming-zhen/articles/4317014.html
在平时的编程中,我们会经常用到数组,并且需要知道数组的长度,有时我们可以明确的知道数组的长度,但有时并不,这时,可以借用sizeof(),来获得数组的长度,如下:
arrayLength = sizeof(array) / sizeof(array[0]);
在使用sizeof() 获得数组长度时,需要注意,如果数组array 和 sizeof() 的使用 是在同一个文件中,那么array在定义时,不需要明确数组长度;如果他们在不同的文件中时,则array在定义时必须明确长度,否则会报错 “ incomplete type is not allowed ”。
例:
a.c 文件中定义了数组array
int array[] = {0,1,2,3,4,5,6,7,8,9};
在a.c文件中我们可以用sizeof() 来获得array的长度
arrayLength = sizeof(array) / sizeof(array[0]);
或者
arrayLength = sizeof(array) / sizeof(int);
如果此时我们在b.c文件中使用同样的方法来获得array的长度,那么在编译时会报" incomplete type is not allowed "错误
whatever is worth doing is worth doing well...
2 例子2 sizeof数组,字符,字符串
转载:https://blog.csdn.net/ddl2111/article/details/80372563
int arr[] = {1, 2, 3, 4};
sizeof(arr) = 16;
char arr[] = "abc";
sizeof(arr) = 4;
strlen(arr)=3
char arr[] = {'1', '2', '3'};
sizeof(arr) = 3;
strlen(arr)=3
注意:当数组作为函数参数传递当时候,表示当是指针,不能用sizeof(名称),求出来当是计算机字长。
3 sizeof和strlen区别联系
转载:https://blog.csdn.net/21aspnet/article/details/1539951
3.1
char str[20]="0123456789";
int a=strlen(str); /*a=10;strlen 计算字符串的长度,以\0'为字符串结束标记。
int b=sizeof(str); /*b=20;sizeof 计算的则是分配的数组str[20] 所占的内存空间的大小,不受里面存储的内容影响
3.2
char *str1="absde";
char str2[]="absde";
char str3[8]={'a',};
char ss[] = "0123456789";
输出:
sizeof(str1)=4
sizeof(str2)=6;
sizeof(str3)=8;
sizeof(ss)=11
首先说明一点,char类型占一个字节,所以sizeof(char)是1,这点要理解
str1是一个指针,只是指向了字符串"absde"而已。所以sizeof(str1)不是字符串占的空间也不是字符数组占的空间,而是一个字符型指针占的空间。所以sizeof(str1)=sizeof(char*)=4,在C/C++中一个指针占4个字节
str2是一个字符型数组。C/C++规定,对于一个数组,返回这个数组占的总空间,所以sizeof(str2)取得的是字符串"absde"占的总空间。"absde"中,共有a b s d e \0六个字符,所以str2数组的长度是6,所以sizeof(str2)=6*sizeof(char)=6
str3已经定义成了长度是8的数组,所以sizeof(str3)为8
str4和str2类似,'0' '1' ... '9'加上'\0'共11个字符,所以ss占的空间是8
总之,对于指针,sizeof操作符返回这个指针占的空间,一般是4个字节;而对于一个数组,sizeof返回这个数组所有元素占的总空间。char与char[]容易混淆,一定要分清,而且char="aaa"的写法现在不被提倡,应予以避免
而strlen不区分是数组还是指针,就读到\0为止返回长度。而且strlen是不把\0计入字符串的长度的。