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

来源:互联网 发布:啄木鸟图片下载器mac 编辑:程序博客网 时间:2024/06/08 13:11
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型,所以大小是4printf("%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结束,所以会产生一个随机值xprintf("%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 0