sizeof()和strlen()的区别

sizeof:              求所分配的字节数,单位是字节;

strlen:               获取字符的个数;

几个重要的知识点: 

  • 数组名单独放在sizeof内部,数组名表示整个数组的大小;
  • &+数组名,数组名表示整个数组;&数组名,取出的是整个数组的地址;
  • 除此之外,所有的数组名都是首元素的地址;
  • 一些典型的例子:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
int main()
{
	int a[] = { 1, 2, 3, 4 };
	printf("%d\n", sizeof(a));        //16
	printf("%d\n", sizeof(a+0));      //4
	printf("%d\n", sizeof(*a));       //4
	printf("%d\n", sizeof(a+1));      //4
	printf("%d\n", sizeof(a[1]));     //4
	printf("%d\n", sizeof(&a));       //4
	printf("%d\n", sizeof(*&a));      //16
	printf("%d\n", sizeof(&a+1));     //4
	printf("%d\n", sizeof(&a[0]));    //4
	printf("%d\n", sizeof(&a[0]+1));  //4
        system("pause");
	return 0;}
  1. sizeof(a)       数组名单独放在sizeof内部,表示整个数组的大小。 整个数组4个元素,一个元素4个字节,共16个字节。
  2. sizeof(a+0)  数组名没有单独放在sizeof内部,数组名前也没有&,所以a表示首元素的地址;a+0依旧表示首元素的地址,地址为4个字节。
  3. sizeof(*a)     数组名没有单独放在sizeof内部,数组名前也没有&,所以a表示首元素的地址;*a表示首元素,int(整形)元素占4个字节。
  4. sizeof(a+1)   数组名没有单独放在sizeof内部,数组名前也没有&,所以a表示首元素的地址;a+1表示第二个元素的地址。地址占4个字节。
  5. sizeof(a[1])   a[1]表示第二个元素,int(整形)元素占4个字节。
  6. sizeof(&a)    数组名没有单独放在sizeof内部,但是数组名前有&,所以&a表示整个数组的地址。地址占4个字节。
  7. sizeof(*&a)   数组名没有单独放在sizeof内部,但是数组名前有&,所以&a表示整个数组的地址;*(&a)表示整个数组的元素。整个数组4个元素,一个元素4个字节,共16个字节。
  8. sizeof(&a+1) 数组名没有单独放在sizeof内部,但是数组名前有&,所以&a表示整个数组的地址;&a+1表示跳过整个数组的下一个元素地址。地址占4个字节
  9. sizeof(&a[0]) a[0]表示首元素,&a[0]表示首元素的地址。地址占4个字节
  10. sizeof(&a[0]+1)a[0]表示首元素,&a[0]表示首元素的地址,&a[0]+1,表示第二个元素的地址。地址占4个字节

#include<stdio.h>
#include<stdlib.h>
int main()
{
	char arr[] = { 'a','b', 'c', 'd', 'e', 'f' };
	printf("%d\n", sizeof(arr));         //6
	printf("%d\n", sizeof(arr + 0));     //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
        system("pause");
	return 0;
}

 

  1. sizeof(arr)       数组名单独放在sizeof内部,表示整个数组的大小;整个数组有6个元素,每个元素1个字节,共6个字节。
  2. sizeof(arr+0)   数组名没有单独放在sizeof内部,数组名前也没有&,所以arr表示首元素的地址;arr+0也表示首元素的地址,地址占4个字节。
  3. sizeof(*arr)      数组名没有单独放在sizeof内部,数组名前也没有&,所以arr表示首元素的地址;*arr表示首元素,字符型元素占1个字节。
  4. sizeof(arr[1])   arr[1]表示第二个元素,字符型元素占1个字节。
  5. sizeof(&arr)    数组名没有单独放在sizeof内部,但数组名前有&,所以&arr表示整个数组的地址;地址占4个字节。
  6. sizeof(&arr+1) 数组名没有单独放在sizeof内部,但数组名前有&,所以&arr表示整个数组的地址;&arr+1表示跳过整个数组,下一个元素的地址;地址占4个字节。
  7. sizeof(&arr[0]+1) &arr[0]表示首元素的地址,&arr[0]+1表示第二个元素的地址;地址占4个字节。

 

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
	       char arr[] = { 'a','b', 'c', 'd', 'e', 'f' };
		printf("%d\n", strlen(arr));            //随机值
		printf("%d\n", strlen(arr + 0));        //随机值
		//printf("%d\n", strlen(*arr));           //error
		//printf("%d\n", strlen(arr[1]));         //error
		printf("%d\n", strlen(&arr));           //随机值
		printf("%d\n", strlen(&arr + 1));       //比第一个随机值少6
		printf("%d\n", strlen(&arr[0] + 1));    //比第一个随机值少1
	    system("pause");
	    return 0;
}

 

  1. strlen(arr)  arr表示首元素的地址,所以字符串的长度从首元素开始数,但由于没有字符串结束标志'\0';所以为随机值。
  2. strlen(arr+0)  arr表示首元素的地址,arr+0也表示首元素的地址,所以字符串的长度从首元素开始数,但由于没有字符串结束标志'\0';所以为随机值(和1的随机值相等)。
  3. strlen(*arr)    arr表示首元素的地址,*arr表示首元素‘a’,'a'的ascii值为97;即为strlen(97),但strlen()括号里面应该为地址值,所以格式错误。
  4. strlen(arr[1])arr[1]表示第二个元素‘b’,'b'的ascii值为98;即为strlen(98),但strlen()括号里面应该为地址值;所以错误;
  5. strlen(&arr)  &arr表示数组(首元素)的地址,所以字符串的长度从首元素开始数,但由于没有字符串结束标志'\0';所以为随机值(和1的随机值相等)。
  6. strlen(&arr+1) &arr表示整个数组的地址;&arr+1表示跳过整个数组,下一个元素的地址;由于没有字符串结束标志‘\0’,所以为随机值(比1的随机值小6)。
  7. strlen(&arr[0]+1) &arr[0]表示首元素的地址,&arr[0]+1表示第二个元素的地址,由于没有字符串结束标志‘\0’,所以为随机值(比1的随机值小1)。

 

#include<stdio.h>
#include<stdlib.h>
int main()
{
	
	        char arr[] = "abcdef";
		printf("%d\n", sizeof(arr));     //7
		printf("%d\n", sizeof(arr + 0));  //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
	        system("pause");
		return 0;
}
  1. sizeof(arr)        数组名单独放在sizeof内部,表示整个数组的大小,整个数组7个元素,每个元素有1个字节,总共7个字节。
  2. sizeof(arr+0)   数组名没有单独放在sizeof内部,数组名前也没有&,所以arr表示首元素的地址;arr+0也表示首元素的地址,地址占4个字节。
  3. sizeof(*arr)      数组名没有单独放在sizeof内部,数组名前也没有&,所以arr表示首元素的地址;*arr表示首元素,字符型元素占1个字节。
  4. sizeof(arr[1])   arr[1]表示第二个元素,字符型元素占1个字节。
  5. sizeof(&arr)     数组名没有单独放在sizeof内部,数组名前有&,所以&arr表示整个数组的地址,地址占4个字节。
  6. sizeof(&arr+1) 数组名没有单独放在sizeof内部,数组名前有&,所以&arr表示整个数组的地址,&arr+1表示跳过整个数组的下一个元素的地址;地址为4个字节。
  7. sizeof(&arr[0]+1)  &arr[0]表示首元素的地址,&arr[0]+1表示第二个元素的地址;地址为4个字节。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
	
	       char arr[] = "abcdef";
		printf("%d\n", strlen(arr));     //6
		printf("%d\n", strlen(arr + 0));  //6
		// printf("%d\n", strlen(*arr));     //error
		// printf("%d\n", strlen(arr[1]));   //error
		printf("%d\n", strlen(&arr));     //6
		printf("%d\n", strlen(&arr + 1));  //随机值
		printf("%d\n", strlen(&arr[0] + 1));//5
	        system("pause");
		return 0;
}

 

  1. strlen(arr)  arr表示首元素的地址,所以字符串的长度从首元素开始数,为6
  2. strlen(arr+0)  arr表示首元素的地址,arr+0也表示首元素的地址,所以字符串的长度从首元素开始数,为6
  3. strlen(*arr)    arr表示首元素的地址,*arr表示首元素‘a’,'a'的ascii值为97;即为strlen(97),但strlen()括号里面应该为地址值,所以错误。
  4. strlen(arr[1])arr[1]表示第二个元素‘b’,'b'的ascii值为98;即为strlen(98),但strlen()括号里面应该为地址值;所以错误;
  5. strlen(&arr)  &arr表示数组(首元素)的地址,所以字符串的长度从首元素开始数,为6。
  6. strlen(&arr+1) &arr表示整个数组的地址;&arr+1表示跳过整个数组,下一个元素的地址;由于没有字符串结束标志‘\0’,所以为随机值。
  7. strlen(&arr[0]+1) &arr[0]表示首元素的地址,&arr[0]+1表示第二个元素的地址,为5。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
	char *p = "abcdef";
	printf("%d\n", sizeof(p));     //4
	printf("%d\n", sizeof(p+1));   //4
	printf("%d\n", sizeof(*p));     //1
	printf("%d\n", sizeof(p[0]));   //1
	printf("%d\n", sizeof(&p));     //4
	printf("%d\n", sizeof(&p + 1));  //4
	printf("%d\n", sizeof(&p[0] + 1));//4
	system("pause");
	return 0;
}
  1. sizeof(p)       p是指针变量,存放a的地址,地址为4个字节。
  2. sizeof(p+1)   p是指针变量,存放a的地址,p+1存放b的地址,地址为4个字节。
  3. sizeof(*p)      p是指针变量,存放a的地址,*p表示元素a  ,为1个字节。
  4. sizeof(p[0])    p[0]=*(p+0),表示元素a,为1个字节。
  5. sizeof(&p)    指针变量p的地址,为4个字节。
  6. sizeof(&p+1)   指向跳过p的下一个元素的地址。为4个字节
  7. sizeof(&p[0]+1)   p[0]表示元素a,&p[0]为元素a的地址,加1为b的地址,4个字节。

 

 

 

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
	char *p = "abcdef";
	printf("%d\n",strlen(p));     //6
	printf("%d\n", strlen(p + 1));  //5
	// printf("%d\n", strlen(*p));     //error
	// printf("%d\n", strlen(p[0]));   //error
	printf("%d\n", strlen(&p));     //随机值
	printf("%d\n", strlen(&p + 1));  //随机值
	printf("%d\n", strlen(&p[0] + 1));//5
	system("pause");
	return 0;
}
  1. strlen(p)   p为指针变量,存放a的地址,从a向后数为6。
  2. strlen(p+1)   p为指针变量,存放a的地址,p+1存放b的地址,从b向后数为5.
  3. strlen(*p)   p为指针变量,存放a的地址,*p表示元素a,元素a的ascii为97,但strlen()括号里面应该是地址,所以错误。
  4. strlen(p[1])p[1]表示第二个元素b,b的ascii码为98,但strlen()括号里面应该是地址,所以错误。
  5. strlen(&p)p为指针变量存放a的地址,但&p表示p的地址,我们并不知道p的地址有几位,所以为随机值。
  6. strlen(&p+1) p为指针变量存放a的地址,但&p表示p的地址,&p+1表示跨过p的下一个元素地址,后面的地址是什么我们无法确定,所以为随机值。
  7. strlen(&p[0]+1)  p[0]表示a,&p[0]为a的地址,&p[0]+1表示b的地址,从b向后数为5.

二维数组

eg:  a[3][4]  表示一个三行四列的数组,数组名为a。

       我们可以把第一行的数组名当作a[0];可以把第二行的数组名当作a[1]; 可以把第三行的数组名当作a[2];

#include<stdio.h>
#include<stdlib.h>
int main()
{
	//二维数组
	int a[3][4] = { 0 };
	printf("%d\n", sizeof(a));       //48
	printf("%d\n", sizeof(a[0][0])); //4
	printf("%d\n", sizeof(a[0]));    //16
	printf("%d\n", sizeof(a[0]+1));  //4
	printf("%d\n", sizeof(a + 1));   //4
	printf("%d\n", sizeof(&a[0] + 1));//4
	printf("%d\n", sizeof(*a));       //16
	printf("%d\n", sizeof(a[3]));   //16
        system("pause");
	return 0;
}
  1. sizeof(a)           数组名单独放在了sizeof内部,表示整个数组的大小,共12个元素,一个元素4个字节,共48个字节。
  2. sizeof(a[0][0])   a[0][0]表示a[0][0]的地址,为4个字节。
  3. sizeof(a[0])       数组名单独sizeof内部,表示整个数组的大小,4个元素,一个元素4个字节,一共16个字节。
  4. sizeof(a+1)        数组名没有单独放在sizeof内部,数组名前没有&,所以a表示首元素a[0]的地址,a+1为第二行的地址。
  5. sizeof(&a[0]+1)  数组名没有单独放在sizeof内部,数组名有&,表示数组a[0]的地址,&a[0]+1表示数组a[1]的地址。
  6. sizeof(*a)         数组名没有单独放在sizeof内部,数组名前没有&,所以a表示首元素a[0]的地址,*a表示首元素,一共4个元素,每个元素4个字节,共16个字节。
  7. sizeof(a[3])      数组名单独sizeof内部,表示整个数组的大小,4个元素,一个元素4个字节,一共16个字节。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值