关于数组我们必须会的的运算

Sizeof与Strlen的区别

一、sizeof
sizeof(...)是运算符,在头文件中typedef为unsigned int,其值在编译时即计算好了,参数可以是数组、指针、类型、对象、函数等。
它的功能是:获得保证能容纳实现所建立的最大对象的字节大小。
由于在编译时计算,因此sizeof不能用来返回动态分配的内存空间的大小。实际上,用sizeof来返回类型以及静态分配的对象、结构或数组所占的空间,返回值跟对象、结构、数组所存储的内容没有关系。
具体而言,当参数分别如下时,sizeof返回的值表示的含义如下:
数组——编译时分配的数组空间大小;
指针——存储该指针所用的空间大小(存储该指针的地址的长度,是长整型,应该为4);
类型——该类型所占的空间大小;
对象——对象的实际占用空间大小;
函数——函数的返回类型所占的空间大小。函数的返回类型不能是void。
**************

二、strlen
strlen(...)是函数,要在运行时才能计算。参数必须是字符型指针(char*)。当数组名作为参数传入时,实际上数组就退化成指针了。
它的功能是:返回字符串的长度。该字符串可能是自己定义的,也可能是内存中随机的,该函数实际完成的功能是从代表该字符串的第一个地址开始遍历,直到遇到结束符NULL。返回的长度大小不包括NULL。

********************************************************************************************************************************************************************************************

#define _CRT_SECURE_NO_WARNINGS 1

#include <stdio.h>
#include <string.h>

int main()
{
	int arr[] = {1, 2, 3, 4};
	char arr1[] = {'a','b','c','d'};
	char *p = "abcdefgf";
	int a[3][4] = {0};

      /*******************************************************
	  ****************一维数组 int型sizeof求解****************
	  ********************************************************/
	printf("%d\n", sizeof(arr));    //sizeof(数组名)表示求整个数组的大小
	printf("%d\n", sizeof(arr+0));  //表示数组首元素的地址
	printf("%d\n", sizeof(*arr));  //表示数组首元素的大小
	printf("%d\n", sizeof(arr+1));  //表示数组第二个元素的地址
	printf("%d\n", sizeof(arr[1]));//表示数组第一个元素的大小
	printf("%d\n", sizeof(&arr));   //表示整个数组的地址,其实还是首元素的地址
	printf("%d\n", sizeof(&arr+1));//表示跳过这个数组的地址,还是表示首地址
	printf("%d\n", sizeof(&arr[0]));//表示首元素的地址
	printf("%d\n", sizeof(&arr[0]+1));//表示第二个元素的地址


	/*********************************************************
	************字符数组 char型 利用sizeof求解*************
	**********************************************************/
    printf("%d\n", sizeof(arr1));   //求整个数组的大小,因为是char型,所以大小是4
	printf("%d\n", sizeof(arr1+0));   //求首元素的地址
	printf("%d\n", sizeof(*arr1));   //求首元素的大小
	printf("%d\n", sizeof(arr1[1]));   //求第二个元素的大小
	printf("%d\n", sizeof(&arr1));   //求整个数组的地址,其实还是首元素的地址
	printf("%d\n", sizeof(&arr1+1));   //&arr1+1表示跳过了这个数组,但还是求地址
	printf("%d\n", sizeof(&arr1[0]+1));   //求第二个元素的地址


	/*********************************************************
	************字符数组 char型 利用strlen求解*************
	**********************************************************/
    printf("%d\n", strlen(arr1));   //  strlen求长度会在遇到\0结束,所以会产生一个随机值x
	printf("%d\n", strlen(arr1+0));   //产生一个随机值x
	//printf("%d\n", strlen(*arr1));   //非法操作,出错
	//printf("%d\n", strlen(arr1[1]));   //非法操作,出错
	printf("%d\n", strlen(&arr1));   //求整个数组的长度,遇到\0结束,所以产生一个随机值,
	printf("%d\n", strlen(&arr1+1));   //跳过这个数组求长度,长度为x-4(针对本数组)
	printf("%d\n", strlen(&arr1[0]+1));   //从第二个元素开始求长度,也会在遇到\0结束,所以为x-1


   /*********************************************************
	************字符串数组 char型 利用sizeof求解*************
	**********************************************************/
     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));    //求第二个元素的地址


	/*********************************************************
	************字符串数组 char型 利用strlen求解*************
	**********************************************************/
       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));  //求从第二个元素开始,求长度


    /*********************************************************
	************二维数组 int型 利用sizeof求解*************
	**********************************************************/
	
	   printf("%d\n", sizeof(a));    //求整个二维数组大小
	   printf("%d\n", sizeof(a[0][0]));    //求首元素的大小
	   printf("%d\n", sizeof(a[0]));    //将二维数组看作一维数组,求首元素的大小
	   printf("%d\n", sizeof(a[0]+1));    //看作一维数组求第二个元素地址
	   printf("%d\n", sizeof(a+1));    //  看作一维数组求第二个元素地址大小
	   printf("%d\n", sizeof(&a[0]+1));    //第二个元素地址
	   printf("%d\n", sizeof(*a));    //求一维数组首元素大小
	   printf("%d\n", sizeof(a[3]));    //将二维数组看作一维数组,求一维数组大小

	   return 0;

}
总结:sizeof(数组名),这里的数组名表示整个数组
&数组名,这里的数组名也表示整个数组



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值