目录
一、sizeof和strlen的对比
1.1sizeof操作符
sizeof 计算变量所占内存内存空间大小的,单位是字节,如果操作数是类型的话,计算的是使用类型创建的变量所占内存空间的大小。sizeof 只关注占用内存空间的大小,不在乎内存中存放什么数据,并且在计算变量的时候,括号可以省略。额外说明size_t就是为sizeof设计的。
就比如以下代码:
#include<stdio.h>
int main()
{
int a = 23;
printf("%d\n", sizeof(a));
printf("%d\n", sizeof a);
printf("%d\n", sizeof(int));
return 0;
}
我们可以看到,结果都是4。
1.2strlen
strlen是C语言库函数,函数功能原型如下:
strlen字符串长度统计的是从形参str中这个地址开始向后,\0之前字符串中字符的个数。如果没有找到\0,那么strlen函数会在内存中⼀直向后找\0字符,直到找到\0为止,所以可能存在越界查找。
就比如下面这段代码:
#include<stdio.h>
#include<string.h>
int main()
{
char arr[] = "SILMY23";
char arr1[] = { 'S','I','L','M','Y' };
printf("%d\n", strlen(arr));
printf("%d\n", strlen(arr1));
return 0;
}
由于前面有\0,后面没有\0,那么第二个原本的长度应该是五,但存在越界查找,所以长度必然不为5.
结果如下:
1.3表格总结
sizeof | strlen | |
性质 | 操作符 | 是库函数,使用需要包括头文件#include<string.h> |
功能 | 计算操作数所占内存的大小,单位是字节 | 求字符串长度 |
特点 | 不关注内存中存放什么数据 | 关注内存中是否有\0,如果没有\0 ,就会持续往后找,可能会越界查找 |
1.4sizeof题目
请思考以下代码,L和S的值:
#include<stdio.h>
int main()
{
short S = 4;
int I = 2;
int L = sizeof(S = I + 23);
printf("%d \n", L);
printf("%d \n", S);
return 0;
}
结果如下:
在上述代码中,S=I+23其实是没有参与计算的,因为在sizeof中的操作数如果是一个表达式,表达式就不参与计算,所以最后的S还是4。其次,sizeof计算其实是按照操作类型来推理的,比如上述中S是short两个字节的短整型,所以L是两个字节。
二、指针,数组笔试题
2.1一维数组
如果你不理解数组名可以跳转至http://t.csdnimg.cn/6zjW4,观看第二点
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));
这是在32位环境和64位环境下的结果
2.2 字符数组
2.2.1
char arr[] = {'S','I','L','M','Y'};
printf("%d\n", sizeof(arr));
printf("%d\n", sizeof(arr + 0));
printf("%d\n", sizeof(*arr));
printf("%d\n", sizeof(arr[1]));
printf("%d\n", sizeof(&arr));
printf("%d\n", sizeof(&arr + 1));
printf("%d\n", sizeof(&arr[0] + 1));
结果如下:
2.2.2
char arr[] = { 'S','I','L','M','Y' };
printf("%d\n", strlen(arr));
printf("%d\n", strlen(arr + 0));
printf("%d\n", strlen(*arr));
printf("%d\n", strlen(arr[1]));
printf("%d\n", strlen(&arr));
printf("%d\n", strlen(&arr + 1));
printf("%d\n", strlen(&arr[0] + 1));
32位结果如下:
64位结果如下:
2.2.3
char arr[] = "SILMY23";
printf("%d\n", sizeof(arr));
printf("%d\n", sizeof(arr + 0));
printf("%d\n", sizeof(*arr));
printf("%d\n", sizeof(arr[1]));
printf("%d\n", sizeof(&arr));
printf("%d\n", sizeof(&arr + 1));
printf("%d\n", sizeof(&arr[0] + 1));
结果如下:
2.2.4
char arr[] = "SILMY23";
printf("%d\n", strlen(arr));
printf("%d\n", strlen(arr + 0));
printf("%d\n", strlen(*arr));
printf("%d\n", strlen(arr[1]));
printf("%d\n", strlen(&arr));
printf("%d\n", strlen(&arr + 1));
printf("%d\n", strlen(&arr[0] + 1));
32位结果如下:
64位结果如下:
2.2.5
char* p = "SILMY23";
printf("%d\n", sizeof(p));
printf("%d\n", sizeof(p + 1));
printf("%d\n", sizeof(*p));
printf("%d\n", sizeof(p[0]));
printf("%d\n", sizeof(&p));
printf("%d\n", sizeof(&p + 1));
printf("%d\n", sizeof(&p[0] + 1));
32位结果如下图:
64位结果如下图:
2.2.6
char* p = "SILMY23";
printf("%d\n", strlen(p));
printf("%d\n", strlen(p + 1));
printf("%d\n", strlen(*p));
printf("%d\n", strlen(p[0]));
printf("%d\n", strlen(&p));
printf("%d\n", strlen(&p + 1));
printf("%d\n", strlen(&p[0] + 1));
32位结果如下:
64位结果如下: