目录
  • 一、概念         
    • sizeof:
    • strlen:
  • 二、例题及解析
    • 2.1 一维数组
    • 2.2 字符数组
    • 2.3 二维数组
  • 三、总结

    一、概念         

    sizeof:

    sizeof操作符的结果类型为size_t,(它在头文件用typedfe定义为unsigned int类型),计算的是分配空间的实际字节数。sizeof是运算符,可以以类型、函数、做参数 。

    strlen:

    strlen结果类型也为size_t(size_t strlen( const char *string )),但strlen是计算的空间中字符的个数(不包括‘\0’)。strlen是函数,只能以char*(字符串)做参数。而且,要想得到的结果正确必须包含 ‘\0’(通过strlen的实现得知)。

    二、例题及解析

    首先我们需要知道数组名的意义:

    1.sizeof(数组名),这里的数组名表示整个数组,计算的是整个数组的大小。

    2.&数组名,这里的数组名表示整个数组,取出的是整个数组的地址。

    3.除此之外所有的数组名都表示首元素的地址。

    2.1 一维数组

    int a[] = { 1,2,3,4 };
    	printf("%d\n", sizeof(a));		   //16  a是整个数组的大小,sizeof计算出结果为16字节
    	printf("%d\n", sizeof(a+0));       //4   a是首元素的地址
    	printf("%d\n", sizeof(*a));		   //4	  首元素地址的解引用
    	printf("%d\n", sizeof(a+1));	   //4   2的地址
    	printf("%d\n", sizeof(a[1]));      //4
    	printf("%d\n", sizeof(&a));		   //4   &a数组的地址,4个字节
    	printf("%d\n", sizeof(*&a));       //16  *和&抵消
    	printf("%d\n", sizeof(&a+1));      //4   4个字节的地址,跳过了4
    	printf("%d\n", sizeof(&a[0]));	   //4
    	printf("%d\n", sizeof(&a[0]+1));   //4
    	//总结: 只要是地址,不论什么类型,大小都为4个字节

    2.2 字符数组

    char arr[] = { 'a','b','c','d','e','f' };
    	printf("%d\n", sizeof(arr));		//6
    	printf("%d\n", sizeof(arr+0));		//4  首元素地址为4个字节
    	printf("%d\n", sizeof(*arr));		//1
    	printf("%d\n", sizeof(arr[1]));		//1
    	printf("%d\n", sizeof(&arr));		//4
    	printf("%d\n", sizeof(&arr+1));		//4
    	printf("%d\n", sizeof(&arr[0]+1));	//4
     
    	printf("%d\n", strlen(arr));		//随机值 strlen要找到\0才能返回数据的长度
    	printf("%d\n", strlen(arr+0));		//随机值
    	printf("%d\n", strlen(*arr));		//err strlen(a)会把a的ASCII码值97当作地址往后找
    	printf("%d\n", strlen(arr[1]));		//err
    	printf("%d\n", strlen(&arr));		//随机值
    	printf("%d\n", strlen(&arr+1));		//随机值
    	printf("%d\n", strlen(&arr[0]+1));	//随机值
    char arr[] = "abcdef";
    	printf("%d\n", sizeof(arr));			//7  arr是数组的地址
    	printf("%d\n", sizeof(arr + 0));		//4  arr是首元素的地址
    	printf("%d\n", sizeof(*arr));			//1
    	printf("%d\n", sizeof(arr[1]));			//1
    	printf("%d\n", sizeof(&arr));			//4  数组的地址 4个字节
    	printf("%d\n", sizeof(&arr + 1));		//4
    	printf("%d\n", sizeof(&arr[0] + 1));	//4
     
    	printf("%d\n", strlen(arr));			//6
    	printf("%d\n", strlen(arr + 0));		//6
    	printf("%d\n", strlen(*arr));			//err 
    	printf("%d\n", strlen(arr[1]));			//err
    	printf("%d\n", strlen(&arr));			//6
    	printf("%d\n", strlen(&arr + 1));		//随机值
    	printf("%d\n", strlen(&arr[0] + 1));	//5
    char *p = "abcdef";
    	printf("%d\n", sizeof(p));			//4  p是指针变量,求指针变量的大小,为4个字节
    	printf("%d\n", sizeof(p + 1));		//4  p+1为b的地址
    	printf("%d\n", sizeof(*p));			//1
    	printf("%d\n", sizeof(p[0]));		//1
    	printf("%d\n", sizeof(&p));;		//4  指针p的地址
    	printf("%d\n", sizeof(&p + 1));		//4
    	printf("%d\n", sizeof(&p[0] + 1));	//4  b的地址
     
    	printf("%d\n", strlen(p));			//6
    	printf("%d\n", strlen(p + 1));		//5
    	printf("%d\n", strlen(*p));			//err strlen需要传入地址
    	printf("%d\n", strlen(p[0]));		//err
    	printf("%d\n", strlen(&p));			//随机值
    	printf("%d\n", strlen(&p + 1));		//随机值
    	printf("%d\n", strlen(&p[0] + 1));	//5  从b开始数

    2.3 二维数组

    	int a[3][4] = { 0 };
    	printf("%d\n", sizeof(a));			 
    	//48  二维数组中sizeof(a),a同样表示整个数组
    	printf("%d\n", sizeof(a[0][0]));	 
    	//4 
    	printf("%d\n", sizeof(a[0]));		 
    	//16 a[0]可看作第一行的数组名,sizeof(数组名)计算第一行数组大小
    	printf("%d\n", sizeof(a[0] + 1)); 	 
    	//4  a[0]表示第一行首元素地址,即a[0][0]地址,再+1为a[0][1]地址
    	printf("%d\n", sizeof(*(a[0] + 1))); 
    	//4  
    	printf("%d\n", sizeof(a + 1));		 
    	//4  a为第一行一维数组的地址,+1为第二行的地址
    	printf("%d\n", sizeof(*(a + 1)));	 
    	//16 第二行地址的解引用,是数组指针的解引用,访问的是一个数组的大小
    	printf("%d\n", sizeof(&a[0] + 1));	 
    	//4  第一行地址+1,得第二行地址
    	printf("%d\n", sizeof(*(&a[0] + 1)));
    	//16 第二行的大小
    	printf("%d\n", sizeof(*a));			 
    	//16 第一行地址解引用是第一行的大小
    	printf("%d\n", sizeof(a[3]));		 
    	//16 计算第四行的大小(即使没有第四行)

    三、总结

    这些都是来自往年的笔试题,非常重要!!!学废了吗?!

    建议收藏反复阅读思考,加深对指针、数组和内存的理解!!!

    声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。