详解strlen和sizeof在数组的中的使用(一)

 目录

一、前言

二、sizeof和strlen他们各自是是什么?有什么区别?

sizeof类型的题目

题目解析 :

32位平台下:​

 64位平台下:


一、前言

     前面我们学习了字符串函数的使用,不过呢字符串函数也基本结束了,现在呢我们来讲点

不一样的东西,有关于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位平台下:

 所以结果就是这样。ok,咱们下期见


猜你喜欢

转载自blog.csdn.net/weixin_60719453/article/details/120333056#comments_27271315