sizeof 计算的是数据在内存中存放的长度,单位是“字节”,可以对任何数据类型做运算,而且它是一个运算符(和+、-、*、\类似);当对字符串计算时,包含末尾的"\0";当对字符数组操作时,返回的是数组的总的长度。 strlen 计算的是字符串的长度,单位是“字符”,只能对字符串运算,而且它是函数,计算时,不包含末尾的"\0";当对字符数组操作时,返回的是数组总存放的字符串的实际长度(也就是\0之前的),也就是当把数组作为参数传递给strlen时是会退化成char*指针的。 例如:char *p = "haha"; printf("%d\n", sizeof("hehe"));//5 printf("%d\n", strlen("hehe"));//4 printf("%d\n", sizeof(*p));//1 printf("%d\n", sizeof(p));//4
#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<string.h> int main() {//一维数组 int a[] = { 1, 2, 3, 4 }; //一个整型数组,4个元素 printf("第一题:%d\n", sizeof(a));//16 //数组名单独放在sizeof内,此时数字组名表示整个数组,及整个数组的长度为4*4,单位为字节 printf("第二题:%d\n", sizeof(a + 0));//4 //此处数组名没有单独放在sizeof内,数组名降级仅表示首元素地址,首元素地址+0仍为首元素地址 //需注意地址存放在内存中 均为 4个字节 printf("第三题:%d\n", sizeof(*a));//4 //数组名表示首元素地址,加解引用操作后,表示首元素1,整型占4个字节 printf("第四题:%d\n", sizeof(a + 1));//4 //首元素地址+1为第二个元素地址,若是地址即占4个字节 printf("第五题:%d\n", sizeof(a[1]));//4 //a[1]即第二个元素2,整型占4个字节 printf("第六题:%d\n", sizeof(&a));//4 //&后面跟数组名,此时数字组名表示整个数组,即整个数组的地址,若是地址即占4个字节 printf("第七题:%d\n", sizeof(&a + 1));//4 //同上&a为整个数组地址,地址+1仍为地址,地址即占4个字节 //需注意:此处数组地址+1,表示跳过数组,元素4后面的地址,应与第四题区分开 printf("第八题:%d\n", sizeof(&a[0]));//4 //&a[0]即首元素地址,若是地址即占4个字节 printf("第九题:%d\n", sizeof(&a[0] + 1));//4 //&a[0]+1即第二个元素地址,若是地址即占4个字节 //字符数组 char arr1[] = {'a','b','c','d','e','f'}; //定义一个有6个元素的字符数组 printf("第一题: %d\n",sizeof(arr1));//6 //数组名单独放在sizeof内,此时数字组名表示整个数组,及整个数组的长度为6 * 1,单位为字节 printf("第二题: %d\n", sizeof(arr1+0));//4 //此处数组名没有单独放在sizeof内,数组名降级仅表示首元素地址,首元素地址+0仍为首元素地址 //需注意地址存放在内存中 均为 4个字节 printf("第三题: %d\n", sizeof(*arr1));//1 //数组名表示首元素地址,加解引用操作后,表示首元素'a',字符型占1个字节 printf("第四题: %d\n", sizeof(arr1[1]));//1 //a[1]即第二个元素2,整型占4个字节 printf("第五题: %d\n", sizeof(&arr1));//4 //&后面跟数组名,此时数字组名表示整个数组,即整个数组的地址,若是地址即占4个字节 printf("第六题: %d\n", sizeof(&arr1+1));//4 //同上&arr为整个数组地址,地址+1仍为地址,地址即占4个字节 //需注意:此处数组地址+1,表示跳过数组,元素'f'后面的地址 printf("第七题: %d\n", sizeof(&arr1[0]+1));//4 //&a[0]+1即第二个元素地址,若是地址即占4个字节 //arr1[] = {'a','b','c','d','e','f'}; //注:strlen参数应为 字符串地址且遇到'\0'才结束 printf("第八题: %d\n",strlen(arr1));//随机数 //arr1表示首元素地址,一直没有找到'\0',给了一个随机数 printf("第九题: %d\n", strlen(arr1+0));//随机数 //arr1+0表示首元素地址,一直没有找到'\0',给了一个随机数 //printf("第十题: %d\n", strlen(*arr1));//报错(测试前面值时应注释掉) *arr1表示首元素'a',不是地址 //printf("第十一题: %d\n", strlen(arr1[1]));//报错 //arr1[1]表示第二个元素'b',不是地址 printf("第十二题: %d\n", strlen(&arr1));//随机数(会有警告,参数类型不同) //整个数组的元素的地址,一直没有找到'\0',给了一个随机数 printf("第十三题: %d\n", strlen(&arr1+1));//随机数 //来到'f'后面的地址,一直没有找到'\0',给了一个随机数 printf("第十四题: %d\n", strlen(&arr1[0]+1));//随机数 //&arr1[0]+1表示第二个元素'b'地址,一直没有找到'\0',给了一个随机数 //字符串 char *p = "abcdef"; //一串字符串默认后面有一个'\0' //定义一个指针p,指向有6+1个元素的字符串首地址 printf("第一题: %d\n", sizeof(p));//4 //p为指针,指针的长度为4个字节 printf("第二题: %d\n", sizeof(p + 0));//4 //p表示首元素地址,首元素地址+0仍为首元素地址 printf("第三题: %d\n", sizeof(*p));//1 //p表示首元素地址,加解引用操作后,表示首元素'a',字符型占1个字节 printf("第四题: %d\n", sizeof(p[1]));//1 //p[1]即第二个元素'b',字符型占1个字节 printf("第五题: %d\n", sizeof(&p));//4 //&p,即指针p的地址,若是地址即占4个字节 printf("第六题: %d\n", sizeof(&p + 1));//4 //同上&p指针p的地址,地址+1仍为地址,地址即占4个字节 //需注意:此指针p的地址+1,来到指针p地址后面的地址 printf("第七题: %d\n", sizeof(&p[0] + 1));//4 //&p[0]+1即第二个元素地址,若是地址即占4个字节 //char *p = "abcdef"; //一串字符串默认后面有一个'\0' //定义一个指针p,指向有6+1个元素的字符串首地址 printf("第八题: %d\n", strlen(p));//6 //前面说字符串有7个元素 //但是strlen求长度时并不把'\0'计算在内 //p表示首元素地址,找到'\0',长度为6 printf("第九题: %d\n", strlen(p + 1));//5 //p+1表示第二个元素地址,即从第二个开始找,找到'\0',长度为5 //printf("第十题: %d\n", strlen(*p));//报错(测试前面值时应注释掉) *p表示首元素'a',不是地址 //printf("第十一题: %d\n", strlen(p[1]));//报错 //p[1]表示第二个元素'b',不是地址 printf("第十二题: %d\n", strlen(&p));//随机数 //&p,即指针p的地址,一直没有找到'\0',给了一个随机数 printf("第十三题: %d\n", strlen(&p + 1));//随机数 //来到指针p的地址后面的地址,一直没有找到'\0',给了一个随机数 printf("第十四题: %d\n", strlen(&p[0] + 1));//5 //&p[0]+1表示第二个元素'b'的地址,即从第二个开始找,找到'\0',长度为5 //二维数组 int arr2[3][4] = {0}; //定义一个3行4列的二维数组 printf("第一题:%d\n", sizeof(arr2));//48 //数组名单独放在sizeof内,此时数字组名表示整个数组,及整个数组的长度为(3*4)*4,单位为字节 printf("第二题:%d\n", sizeof(arr2[0][0]));//4 //arr2[0][0]表示首元素,整型4个字节 printf("第三题:%d\n", sizeof(arr2[0]));//16 //arr2[0]表示二维数组的首元素,即第一行元素长度,4*4 printf("第四题:%d\n", sizeof(arr2[0] + 1));//4 //二维数组首元素+1为第二个元素,arr2[0] + 1,相当于给一个数组元素+1,转化为整形,长度为4 printf("第五题:%d\n", sizeof(arr2+1));//4 // 此处数组名没有单独放在sizeof内,数组名降级仅表示首元素地址,首元素地址 + 1仍为地址 //此处arr2+1表示二维数组的第二个元素的地址,即第二行的地址 printf("第六题:%d\n", sizeof(&arr2[0]+1));//4 //&arr2[0]即首元素地址,&arr2[0]+1仍为数组,即占4个字节 printf("第七题:%d\n", sizeof(*arr2));//16 // 此处数组名没有单独放在sizeof内,数组名降级仅表示首元素地址,解引用后表示第一行,同第二题 //同上&a为整个数组地址,地址+1仍为地址,地址即占4个字节 //需注意:此处数组地址+1,表示跳过数组,元素4后面的地址,应与第四题区分开 printf("第八题:%d\n", sizeof(arr2[3]));//16 //***此处需注意,数组没有第四行,感觉好像数组越界,程序报错,并不是 //sizeof操作符是在编译时计算的,程序还没有运行,并没有给数组分配内存 //此处arr2[3]同第三题的arr2[0] //程序运行时并不执行sizeof里面的语句 fflush(stdin); getchar(); return 0; }
注意:数组名代表整个数组的时候只有两种情况
sizeof(数组名),这里的数组名表示整个数组
&数组名,这里的数组名代表整个数组
关于数组的 sizeof和strlen 的一些计算
最新推荐文章于 2024-03-06 21:31:33 发布