C语言sizeof和strlen的指针和数组面试题详解
一、概念
sizeof:
sizeof操作符的结果类型为size_t,(它在头文件用typedfe定义为unsigned int类型),计算的是分配空间的实际字节数。sizeof是运算符,可以以类型、函数、做参数 。
strlen:
strlen结果类型也为size_t(size_t strlen( const char *string )),但strlen是计算的空间中字符的个数(不包括‘\0’)。strlen是函数,只能以char*(字符串)做参数。而且,要想得到的结果正确必须包含 ‘\0’(通过strlen的实现得知)。
二、例题及解析
首先我们需要知道数组名的意义:
1.sizeof(数组名),这里的数组名表示整个数组,计算的是整个数组的大小。
2.&数组名,这里的数组名表示整个数组,取出的是整个数组的地址。
3.除此之外所有的数组名都表示首元素的地址。
2.1 一维数组
int a[] = { 1,2,3,4 };
printf("%d\n", sizeof(a)); //16 a是整个数组的大小,sizeof计算出结果为16字节
printf("%d\n", sizeof(a+0)); //4 a是首元素的地址
printf("%d\n", sizeof(*a)); //4 首元素地址的解引用
printf("%d\n", sizeof(a+1)); //4 2的地址
printf("%d\n", sizeof(a[1])); //4
printf("%d\n", sizeof(&a)); //4 &a数组的地址,4个字节
printf("%d\n", sizeof(*&a)); //16 *和&抵消
printf("%d\n", sizeof(&a+1)); //4 4个字节的地址,跳过了4
printf("%d\n", sizeof(&a[0])); //4
printf("%d\n", sizeof(&a[0]+1)); //4
//总结: 只要是地址,不论什么类型,大小都为4个字节
2.2 字符数组
char arr[] = { 'a','b','c','d','e','f' };
printf("%d\n", sizeof(arr)); //6
printf("%d\n", sizeof(arr+0)); //4 首元素地址为4个字节
printf("%d\n", sizeof(*arr)); //1
printf("%d\n", sizeof(arr[1])); //1
printf("%d\n", sizeof(&arr)); //4
printf("%d\n", sizeof(&arr+1)); //4
printf("%d\n", sizeof(&arr[0]+1)); //4
printf("%d\n", strlen(arr)); //随机值 strlen要找到\0才能返回数据的长度
printf("%d\n", strlen(arr+0)); //随机值
printf("%d\n", strlen(*arr)); //err strlen(a)会把a的ASCII码值97当作地址往后找
printf("%d\n", strlen(arr[1])); //err
printf("%d\n", strlen(&arr)); //随机值
printf("%d\n", strlen(&arr+1)); //随机值
printf("%d\n", strlen(&arr[0]+1)); //随机值
char arr[] = "abcdef";
printf("%d\n", sizeof(arr)); //7 arr是数组的地址
printf("%d\n", sizeof(arr + 0)); //4 arr是首元素的地址
printf("%d\n", sizeof(*arr)); //1
printf("%d\n", sizeof(arr[1])); //1
printf("%d\n", sizeof(&arr)); //4 数组的地址 4个字节
printf("%d\n", sizeof(&arr + 1)); //4
printf("%d\n", sizeof(&arr[0] + 1)); //4
printf("%d\n", strlen(arr)); //6
printf("%d\n", strlen(arr + 0)); //6
printf("%d\n", strlen(*arr)); //err
printf("%d\n", strlen(arr[1])); //err
printf("%d\n", strlen(&arr)); //6
printf("%d\n", strlen(&arr + 1)); //随机值
printf("%d\n", strlen(&arr[0] + 1)); //5
char *p = "abcdef";
printf("%d\n", sizeof(p)); //4 p是指针变量,求指针变量的大小,为4个字节
printf("%d\n", sizeof(p + 1)); //4 p+1为b的地址
printf("%d\n", sizeof(*p)); //1
printf("%d\n", sizeof(p[0])); //1
printf("%d\n", sizeof(&p));; //4 指针p的地址
printf("%d\n", sizeof(&p + 1)); //4
printf("%d\n", sizeof(&p[0] + 1)); //4 b的地址
printf("%d\n", strlen(p)); //6
printf("%d\n", strlen(p + 1)); //5
printf("%d\n", strlen(*p)); //err strlen需要传入地址
printf("%d\n", strlen(p[0])); //err
printf("%d\n", strlen(&p)); //随机值
printf("%d\n", strlen(&p + 1)); //随机值
printf("%d\n", strlen(&p[0] + 1)); //5 从b开始数
2.3 二维数组
int a[3][4] = { 0 };
printf("%d\n", sizeof(a));
//48 二维数组中sizeof(a),a同样表示整个数组
printf("%d\n", sizeof(a[0][0]));
//4
printf("%d\n", sizeof(a[0]));
//16 a[0]可看作第一行的数组名,sizeof(数组名)计算第一行数组大小
printf("%d\n", sizeof(a[0] + 1));
//4 a[0]表示第一行首元素地址,即a[0][0]地址,再+1为a[0][1]地址
printf("%d\n", sizeof(*(a[0] + 1)));
//4
printf("%d\n", sizeof(a + 1));
//4 a为第一行一维数组的地址,+1为第二行的地址
printf("%d\n", sizeof(*(a + 1)));
//16 第二行地址的解引用,是数组指针的解引用,访问的是一个数组的大小
printf("%d\n", sizeof(&a[0] + 1));
//4 第一行地址+1,得第二行地址
printf("%d\n", sizeof(*(&a[0] + 1)));
//16 第二行的大小
printf("%d\n", sizeof(*a));
//16 第一行地址解引用是第一行的大小
printf("%d\n", sizeof(a[3]));
//16 计算第四行的大小(即使没有第四行)
三、总结
这些都是来自往年的笔试题,非常重要!!!学废了吗?!
建议收藏反复阅读思考,加深对指针、数组和内存的理解!!!
到此这篇关于C语言sizeof和strlen的指针和数组面试题详解的文章就介绍到这了,更多相关C语言 指针和数组内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341