本文共 5077 字,大约阅读时间需要 16 分钟。
Sizeof与Strlen的区别:
1.sizeof是运算符,strlen是函数。
2.sizeof操作符的结果类型是size_t,它在头文件中typedef为unsigned int类型。该类型保证能容纳实现所建立的最大对象的字节大小;sizeof可以用类型做参数,strlen只能用char*做参数,且必须是以''\0''结尾的。strlen的结果要在运行的时候才能计算出来,时用来计算字符串的长度,不是类型占内存的大小。
下面看一写运算:
1.一维数组
#include#include int main(){ int a[] = { 1, 2, 3, 4 }; printf("%d\n", sizeof(a));//整个数组的大小 16 printf("%d\n", sizeof(a + 0));//首元素的地址,&a[0]的大小; 4 printf("%d\n", sizeof(*a));//第一个元素,a[0],则占空间为4byte; 4 printf("%d\n", sizeof(a + 1));//数组下一元素的地址,&a[1]的大小;4 printf("%d\n", sizeof(a[1]));//第二个元素; 4 printf("%d\n", sizeof(&a));//数组的地址,即指针的大小; 4 printf("%d\n", sizeof(*&a));//*(数组地址) 16 printf("%d\n", sizeof(&a + 1));//下一个数组的首地址;*(a+1)的大小 4 printf("%d\n", sizeof(&a[0]));//a[0]的地址; 4 printf("%d\n", sizeof(&a[0] + 1));//a[1]的地址; 4 system("pause"); return 0;}
2,字符数组
char arr[] = { 'a', 'b', 'c', 'd', 'e', 'f' }; printf("%d\n", sizeof(arr));//整个数组的大小 6 printf("%d\n", sizeof(arr + 0));//首元素的地址,&arr[0]的大小; 4 printf("%d\n", sizeof(*arr));//第一个元素,arr[0]; 1 printf("%d\n", sizeof(arr + 1));//数组下一元素的地址,&arr[1]的大小;4 printf("%d\n", sizeof(arr[1]));//第二个元素; 1 printf("%d\n", sizeof(&arr));//数组的地址,即指针的大小; 4 printf("%d\n", sizeof(*&arr));//*(数组地址) 6 printf("%d\n", sizeof(&arr + 1));//下一个数组的首地址;*(arr+1)的大小 4 printf("%d\n", sizeof(&arr[0]));//arr[0]的地址; 4 printf("%d\n", sizeof(&arr[0] + 1));//arr[1]的地址; 4 system("pause"); return 0;
int main(){ char arr[] = { 'a', 'b', 'c', 'd', 'e', 'f' }; printf("%d\n", strlen(arr));//arr的长度,strlen以\0结束,但strlen不包括\0。长度是随机值19 printf("%d\n", strlen(arr + 0));//首元素地址; 随机值19; printf("%d\n", strlen(&arr[0]));//首元素地址19 //printf("%d\n", strlen(*arr));//“const char *”与“char”(arr的类型)的间接级别不同,不匹配; //printf("%d\n", strlen(arr[1]));//“const char *”与“char”的间接级别不同 printf("%d\n", strlen(&arr));//“const char *”与“char (*)[6]”的间接级别不同,有警告;数组的地址在数值上等于首元素相同;19 printf("%d\n", strlen(*&arr));//*(数组的地址); 19 printf("%d\n", strlen(&arr + 1));//“const char *”与“char (*)[6]”的间接级别不同 strlen(arr)-6=13 printf("%d\n", strlen(&arr[0] + 1));//下一个元素地址strlen(arr)-1=18 printf("%d\n", strlen(arr + 1));//下一个元素地址;18 system("pause"); return 0;}
注意:strlen(char*)函数求的是字符串的实际长度,它求得方法是从开始到遇到第一个'\0',如果你只定义没有给它赋初值,这个结果是不定的,它会从aa首地址一直找下去,直到遇到'\0'停止。
char arr[] = {"abcdef" }; printf("%d\n", sizeof(arr));//整个数组的大小 7 printf("%d\n", sizeof(arr + 0));//首元素的地址,&arr[0]的大小; 4 printf("%d\n", sizeof(*arr));//第一个元素,arr[0]; 1 printf("%d\n", sizeof(arr[1]));//第二个元素; 1 printf("%d\n", sizeof(arr + 1));//数组下一元素的地址,&arr[1]的大小;4 printf("%d\n", sizeof(&arr));//数组的地址,即指针的大小; 4 printf("%d\n", sizeof(*&arr));//*(数组地址) 7 printf("%d\n", sizeof(&arr + 1));//下一个数组的首地址;*(arr+1)的大小 4 printf("%d\n", sizeof(&arr[0]));//arr[0]的地址; 4 printf("%d\n", sizeof(&arr[0] + 1));//arr[1]的地址; 4 system("pause"); return 0;
char arr[] = { "abcdef" }; printf("%d\n", strlen(arr)); //arr的长度,strlen以\0结束,但strlen不包括\0。 6 printf("%d\n", strlen(arr + 0));//首元素地址; 6 printf("%d\n", strlen(&arr[0]));//首元素地址 6 //printf("%d\n", strlen(*arr)) ;//首元素,“const char *”与“char”(arr的类型)的间接级别不同,不匹配; //printf("%d\n", strlen(arr[1]));//“const char *”与“char”的间接级别不同 printf("%d\n", strlen(&arr));//“const char *”与“char (*)[6]”的间接级别不同,有警告;数组的地址在数值上等于首元素相同;6 printf("%d\n", strlen(*&arr));//*(数组的地址); 6 printf("%d\n", strlen(&arr + 1));//“const char *”与“char (*)[6]”的间接级别不同 ,下一个数组的地址;随机值 printf("%d\n", strlen(&arr[0] + 1));//下一个元素地址strlen(arr)-1=5 printf("%d\n", strlen(arr + 1));//下一个元素地址; 5 system("pause"); return 0;
int main(){ char *p = "abcdef"; printf("%d\n", sizeof(p));//指针变量; 4 printf("%d\n", sizeof(p+1));//指针加1就是加上所指类型的大小; 4 printf("%d\n", sizeof(*p));//首元素;1 printf("%d\n", sizeof(p[0]));//&a[0];1 printf("%d\n", sizeof(&p));//指针变量的地址;4 printf("%d\n", sizeof(&p+1));//&p是二级指针,char**;4 printf("%d\n", sizeof(&p[0]+1));// 4 printf("%d\n", strlen(p));//指针变量;6 printf("%d\n", strlen(p + 1));// 5 //printf("%d\n", strlen(*p));//首元素;“const char *”与“char”的间接级别不同; //printf("%d\n", strlen(p[0]));//&a[0]=arr,“const char *”与“char ”的间接级别不同; printf("%d\n", strlen(&p));//指针变量的地址,“const char *”与“char **”的间接级别不同; 随机值 3 printf("%d\n", strlen(&p + 1));//&p是二级指针,char**,“const char *”与“char **”的间接级别不同; 随机值 11 printf("%d\n", strlen(&p[0] + 1));// 5 system("pause"); return 0;}
3.二维数组
int a[3][4] = { 0 }; printf("%d\n", sizeof(a));//整个数组的大小; 12*4=48 printf("%d\n", sizeof(a[0]));//首元素的大小——首数组的大小;16 printf("%d\n", sizeof(a[0][0]));//首数组的首元素大小; 4 printf("%d\n", sizeof(a[0]+1));//下一个元素a[0][1]; 4 printf("%d\n", sizeof(a+1));//&a[1],第二个元素的地址——第二个数组的地址 4 printf("%d\n", sizeof(&a[0]+1));//下一个元素的地址——下一个数组的地址;(数组指针) 4 printf("%d\n", sizeof(*a));//a[0]; 16 printf("%d\n", sizeof(a[3]));//虽然下标不存在(不允许写入),允许访问 16
转载地址:http://kmypi.baihongyu.com/