目录
一、sizeof()函数和strlen()函数的对比
二、数组和指针笔试题解析
三、指针运算笔试题解析
正文开始
一、sizeof()函数和strlen()函数的对比
1.sizeof()函数
在学习操作符的时候,我们了解了sizeof()函数。sizeof()函数是用来计算变量所占内存空间大小的,单位是字节(byte)。如果我们利用sizeof来计算数据类型的大小时,计算的则是使用该数据类型创建的变量所占内存空间的大小。sizeof只关注占用内存空间的⼤小而不在乎内存中存放什么数据。具体信息可以浏览以下博客:C语言数据类型和变量_求模运算符只能用于整形操作数-CSDN博客。这里就不再对sizeof()函数作过多赘述!
2.strlen()函数
strlen()函数是C语言的库函数,要使用strlen()函数,我们需要在写代码之前先包含string.h头文件,它的功能是用来计算字符串长度的,原型如下:
size_t strlen ( const char * str );
它的计算方法是统计从传入strlen()函数的参数str这个地址开始向后数,直到‘\0’之前字符串中字符的个数。也就是说,strlen()函数会从字符串的第一个字符的地址也就是首元素地址开始一直向后查找字符'\0',直到找到为止,这个过程中可能会存在越界访问。来看下面代码:
#include <stdio.h>int main()
{char arr1[3] = {'a', 'b', 'c'};char arr2[] = "abc";printf("%d\n", strlen(arr1));printf("%d\n", strlen(arr2));return 0;
}
当我们尝试运行这个代码的时候,我们会发现编译器会为我们报出一个警告:
我们也许会这么想: arr1和arr2在内容上应该是一样的,如果要将arr1和arr2打印出来也应该是相同的,但是为什么在计算长度的时候会出现问题呢?如果按我们这样的想法去想的话,arr1和arr2的长度都应该是3才对。当我们运行代码时,得出的结果却大相径庭:
当我们再运行一次时,就会发觉计算arr1的长度时arr1的长度居然是一个随机数:
当我们再次回顾strlen()函数的特性时,也许就会发现问题所在。strlen()函数是从第一个字符开始一直统计字符个数,直到遇到字符'\0'为止。strlen()函数为什么能计算字符串的个数?那肯定是因为字符串的字符个数肯定不止我们在写代码时看到的这几个,实际上在字符串的结尾,还存在着一个隐藏的字符,那就是字符'\0',这也就是为什么我们能够通过strlen()函数来直接计算字符串长度的原因。
而当我们观察arr1时,我们就可以明白,它实际上是一个字符数组。它的元素个数有且仅有三个——'a' 'b' 'c',而没有字符串中自带的字符'\0'。而当我们试图用strlen()函数来计算字符数组的长度时,我们发现这是行不通的,因为字符数组中没有自带字符'\0',但是strlen()函数还是会从第一个字符开始往后数,由于没有结束的标志,所以strlen()函数会一直往后找,这时就会出现越界访问的问题,strlen()函数也不知道何时才能找到字符'\0',所以它在内存的海洋当中漫无目的地寻找,直到找到一个位置恰好为字符'\0'后才会收手,然后返回一个随机值。
/*大家在感情方面千万不要像strlen()函数一样啊,该放手就放手,祝各位都能遇到你爱、爱你的女孩*\
如果我们想要计算字符数组的长度,我们可以像计算数组长度那样来计算,或者是在字符数组的最后一个位置加上一个字符'\0',这样就可以计算字符数组的长度了。
但是要利用strlen()函数计算字符数组的长度时,一定要为字符'\0'留有足够的空间!
3.sizeof()函数和strlen()函数的对比
二、数组和指针笔试试题解析
在学习了sizeof()函数、strlen()函数、数组和指针后,下面有一些企业曾经出过的笔试题,大家可以课下尝试一下,这里就不再过多阐释了
1.一维数组
int a[] = {1,2,3,4};printf("%d\n",sizeof(a));printf("%d\n",sizeof(a+0));printf("%d\n",sizeof(*a));printf("%d\n",sizeof(a+1));printf("%d\n",sizeof(a[1]));printf("%d\n",sizeof(&a));printf("%d\n",sizeof(*&a));printf("%d\n",sizeof(&a+1));printf("%d\n",sizeof(&a[0]));printf("%d\n",sizeof(&a[0]+1));
2.字符数组
(1)代码1
(2)代码2
(3)代码3
(4)代码4
(5)代码5
(6)代码6
3.二维数组
三、指针运算笔试题解析
1.代码1
2.代码2
3.代码3
4.代码4
5.代码5
6.代码6
7.代码7
完