一、前言
前面我们学习了字符串函数的使用,不过呢字符串函数也基本结束了,现在呢我们来讲点
不一样的东西,有关于sizeof和strlen的使用
二、sizeof和strlen他们各自是是什么?有什么区别?
1.sizeof是一个操作符,不需要引头文件,形式一般是sizeof(变量或表达式),计算的是
所占的空间大小。单位是字节,所以他可以计算任意类型的大小。
2.strlen我们相当熟悉,strlen是字符串函数,要引出头文件<string.h>,且他只能计算
字符的大小,单位是字节,不能用来计算其他类型的大小,遇到'\0'才会停止。
3.事实上他们并没有什么关联,一个是操作符,一个是函数。上面标红的部分就是他们的
主要区别了。
先插播一点知识:数组名是首元素地址,只有&数组名和sizeof(数组名) 才表示整个数组,其他的
统统都是首元素地址,只有这两种形式,其中sizeof(数组名)不能加任何东西,也不能少,比如
sizeof(数组名+0),那么此时数组名表示的就是首元素地址。指针就是地址在32位/64位平台下是
4/8字节。
仔细理解上面的话,理解之后那么下面上题目:
sizeof类型的题目
#include<stdio.h> int main() { int arr[] = { 1, 3, 5, 7, 9}; printf("%d\n", sizeof(arr)); printf("%d\n", sizeof(arr+1)); printf("%d\n", sizeof(*arr)); printf("%d\n", sizeof(&arr)); printf("%d\n", sizeof(&arr[0])); printf("%d\n", sizeof(&*arr)); printf("%d\n", sizeof(*&arr)); printf("%d\n", sizeof(&arr+1)); printf("%d\n", sizeof(*arr+1)); printf("%d\n", sizeof(arr+0)); return 0; }
题目解析 :
第一个sizeof(arr),计算的是整的数组的大小所以结果是5*4=20字节 。
第二个sizeof(arr+1)其中arr是首元素地址,arr+1表示的是第二个元素的地址,既然是地址,那就是4或8字节,不理解的话可以看看上面的插播的知识。
第三个sizeof(*arr),*arr表示拿到首元素,而首元素类型是int,所以大小是4字节。
第四个sizeof(&arr),&arr表示拿到整个数组的地址,既然是地址所以是4或8字节。
第五个sizeof(&arr[0]),&arr[0]表示拿到了第一个元素的地址,所以是4或8字节。
第六个sizeof(&*arr),因为&和*是同一优先级的,但是结合性是从从右到左,所以先*arr表示拿到首元素,再&(*arr),表示拿到了第一个元素的地址,所以是4或8字节。
第七个是sizeof(*&arr),先&arr表示拿到整块数组的地址,*(&arr),表示拿到整个数组的所有的元素,因为数组的类型是int,所以是5*4=20字节。
第八个是sizeof(&arr+1),&arr拿到整个数组的地址,&arr+1跳过整个数组,得到下块的地址因为sizeof只是算出,不是具体执行,所以不存在越界访问,既然是地址,是4或8字节。
第九个是sizeof(*arr+1),arr是首元素,*arr拿到首元素,(*arr+1)所以是首元素自增一,(即加1)因为是int类型,所以是4字节。
第十个是sizeof(arr+0),单独的sizeof(arr)表示整个数组,但是arr+0表示首元素地址,所以是4或8字节。
在vs编译器下运行结果如下:
32位平台下:
64位平台下: