C语言sizeof和strlen的指针和数组面试题详解
作者:scut-ALong
strlen是函数,字符串长度,不包括停止符。而sizeof则是内存块的大小,包括停止符。数组是一种数据类型,数据类型的本质就是固定大小,内存块的别名。可以用sizeof()一般都是数据类型
一、概念
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语言 指针和数组内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!