关于sizeof和strlen的一些用法

//sizeof操作符作用是返回对象或者类型在内存中所占的字节数,strlen操作符作用是计算字符串的长度,从内存的某个位置开始扫描,直到遇到第一个结束符\0为止,计算结果不包括\0. 
int a[] = { 1,2,3,4 };
 printf("%d\n", sizeof(a));//数组名单独在sizeof()中和取地址时表示整个数组,sizeof()的单位为字节,因此,sizeof(a)=16.
 printf("%d\n", sizeof(a + 0));//此时数组名没有单独在sizeof()内,因此数组名表示数组首元素地址,而首元素地址加0还指向首元素,又整型数据的储存为4个字节,因此,sizeof(a+0)=4.
 printf("%d\n", sizeof(*a));//数组名没有单独在sizeof()内,因此*a表示引用首元素,所以sizeof(*a)=4.
 printf("%d\n", sizeof(a + 1));//此时数组名表示数组首元素地址,而a+1表示下标为1的元素的地址,所以sizeof(a+1)=4.
 printf("%d\n", sizeof(a[1]));//a[1]表示数组第二个元素,sizeof(a[1])=4.
 printf("%d\n", sizeof(&a));//&a表示取数组的地址,地址在32位平台下用4个字节储存,sizeof(&a)=4.
 printf("%d\n", sizeof(&a + 1));//&a+1表示数组地址(数组地址与首元素地址相同)加1,指向数组a最后一个元素后面的地址,sizeof(&a+1)=4.
 printf("%d\n", sizeof(&a[0]));//&a[0]表示取数组第一个元素的地址,与a+0类似,sizeof(&a[0])=4.
 printf("%d\n", sizeof(&a[0] + 1));//&a[0]+1表示a[0]的地址加1,得到a[1]的地址,sizeof(&a[0]+1)=4.
 
 /*char arr[] = { 'a','b','c','d','e','f' };*/
 printf("%d\n", sizeof(arr));//arr此处代表整个数组,字符型储存为1个字节,sizeof(arr)=6.
 printf("%d\n", sizeof(arr + 0));//此处arr不代表整个数组,仅代表数组首元素的地址,sizeof(arr+0)=4.
 printf("%d\n", sizeof(*arr));//此处arr代表首元素地址,*a代表首元素,sizeof(*arr)=1.
 printf("%d\n", sizeof(arr[1]));//arr[1]为数组第二个元素,sizeof(arr[1])=1.
 printf("%d\n", sizeof(&arr));//&arr表示取数组的地址(与首元素地址相同),sizeof(&arr)=4.
 printf("%d\n", sizeof(&arr + 1));//&arr+1表示数组arr最后一个元素后面的地址,sizeof(&srr+1)=4.
 printf("%d\n", sizeof(&arr[0] + 1));//&arr[0]+1表示数组第二个元素的地址,sizeof(&arr[0]+1)=4.
 
 printf("%d\n", strlen(arr)); //arr代表数组首元素地址,strlen从数组首元素位置开始计数,而数组arr中没有\0,因此strlen(arr)的值是一个大于6的随机值。
 printf("%d\n", strlen(arr + 0)); //arr+0代表数组首元素地址,因数组arr中没有\0,因此strlen(arr+0)是一个大于6的随机值。
 printf("%d\n", strlen(*arr));//*arr表示首元素,strlen(*arr)会让程序崩溃。
 printf("%d\n", strlen(arr[1]));//arr[1]表示第二个元素,同上。
 printf("%d\n", strlen(&arr));//&arr表示取出数组地址(同首元素地址),而数组arr中没有\0,因此strlen(&arr)为大于6的随机值。
 printf("%d\n", strlen(&arr + 1));//&arr表示取出首元素地址,加1后指向数组第二个元素,strlen(&arr+1)为大于5的随机值。
 printf("%d\n", strlen(&arr[0] + 1));//&arr[0]表示取出首元素的地址,加1后指向数组第二个元素,strlen(&arr[0]+1)为大于5的随机值。
 /*char *p = "abcdef"; */
 printf("%d\n", sizeof(p));//指针变量p中存放的是字符串"abcdef"的地址,因此,sizeof(p)值为4.
 printf("%d\n", sizeof(p + 1));//p+1为字符串后的地址,sizeof(p+1)值为4.
 printf("%d\n", sizeof(*p)); //p存放字符串地址(同字符串首元素地址),*p表示数组首元素,字符型数据用一个字节储存,sizeof(*p)=1.
 printf("%d\n", sizeof(p[0]));//p[0]表示数组首元素,用一个字节储存,sizeof(p[0])值为1.
 printf("%d\n", sizeof(&p));//&p表示取出指针变量p的地址,sizeof(&p)等于4.
 printf("%d\n", sizeof(&p + 1));//&p+1表示p后面的地址,sizeof(&p+1)等于4.
 printf("%d\n", sizeof(&p[0] + 1));//&p[0]表示字符串首元素的地址,加1后表示字符串第二个元素的地址,sizeof(&p[0]+1)等于4.
 printf("%d\n", strlen(p)); //p表示字符串地址(同首元素地址),strlen(p)等于6.
 printf("%d\n", strlen(p + 1));//p+1表示字符串第二个元素的地址,strlen(p+1)等于5。
 printf("%d\n", strlen(*p));//*p表示首元素,strlen(*p)会让程序崩溃。
 printf("%d\n", strlen(p[0]));//p[0]表示首元素,同上。
 printf("%d\n", strlen(&p));//&p表示取出p的地址,strlen(&p)为随机值。
 printf("%d\n", strlen(&p + 1));//&p+1表示p地址后面的地址,strlen(&p+1)为随机值。
 printf("%d\n", strlen(&p[0] + 1));//&p[0]+1表示字符串第二个元素的地址,strlen(&p[0]+1)等于5。
 int a[3][4] = { 0 };
 printf("%d\n", sizeof(a));//a表示整个数组,sizeof(a)等于48.
 printf("%d\n", sizeof(a[0][0]));//a[0][0]表示首元素,sizeof(a[0][0])等于4.
 printf("%d\n", sizeof(a[0]));//a[0]表示数组第一行,sizeof(a[0])等于16.
 printf("%d\n", sizeof(a[0] + 1)); //a[0]表示二维数组第一行地址,加1后表示第二行地址,dizeof(a[0]+1)等于4.
 printf("%d\n", sizeof(*a));//a表示二维数组第一行地址,*a表示第一行元素,sizeof(*a)等于16.
 printf("%d\n", sizeof(a[3]));//此二维数组只有三行,没有a[3],但是sizeof(a[3])等于16.
  • 5
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值