栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

(C)关于sizeof()和strlen和指针的习题

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

(C)关于sizeof()和strlen和指针的习题

  关于sizeof的坑

<1>数字数组

#define _CRT_SECURE_NO_WARNINGS
#include 
int main()
{
	int a[] = { 1,2,3,4 }; 
	printf("%dn", sizeof(a));    //   16;a在这里指的是数组a,所以数组a有四个元素=>4*4=16
	printf("%dn", sizeof(a + 0)); //4;a+0在这里被隐式转换为指针,即为a[0]这个元素为4个字节
	printf("%dn", sizeof(*a));//  4;也是隐式类型转化成了int*,在解引用得到int
	printf("%dn", sizeof(a + 1)); //4;a+1在这里被隐式转换为指针,即为a[0]这个元素为4个字节
	printf("%dn", sizeof(a[1])); //4;a[1]为数组第二个元素也是int=>4
	printf("%dn", sizeof(&a));//4;得到了一个数组指针=>int(*)[4],是一个指针为4个字节
	printf("%dn", sizeof(*&a));//16;先&得到了一个数组指针int(*)[4],再解引用得到了int[4],为46个字节
	printf("%dn", sizeof(&a + 1));//4;先&得到了一个数组指针int(*)[4],再+1还是数组指针
	printf("%dn", sizeof(&a[0]));//4;先取下标为int;再&得到了一个int*,为四个字节
	printf("%dn", sizeof(&a[0] + 1)); //4; 先取下标为int; 再& 得到了一个int*, 再+1还是为四个字节
	return 0;
}

运行结果:

<2>字符数组

 

#define _CRT_SECURE_NO_WARNINGS
#include 
int main()
{
	char arr[] = { 'a','b','c','d','e','f' };
	printf("%dn", sizeof(arr));//6;这里是整个字符数组的字节数
	printf("%dn", sizeof(arr + 0));//4;这里隐式转成指针;指针的字节为4
	printf("%dn", sizeof(*arr));//1;隐式转换为char*再解引用为char
	printf("%dn", sizeof(arr[1]));//1;arr[1]为'b',故为1
	printf("%dn", sizeof(&arr));//4;得到了一个数组指针=>char(*)[6],为4
	printf("%dn", sizeof(&arr + 1));//4;同上
	printf("%dn", sizeof(&arr[0] + 1));//4;arr[0]为'a',再&得到了char*
	//printf("%dn", strlen(arr));//未定义行为;没有,
	//printf("%dn", strlen(arr + 0));//同上
	//printf("%dn", strlen(*arr));//同上;arr隐式转换成指针,再解引用得到一个字符,把'a'当成地址
	//printf("%dn", strlen(arr[1]));//同上为'b'
	//printf("%dn", strlen(&arr));//同上,得到char(*)[6];还是把'a'当作地址访问
	//printf("%dn", strlen(&arr + 1));//同上
	//printf("%dn", strlen(&arr[0] + 1));//同上
	return 0;
}

运行结果:

<3>加个指针

#define _CRT_SECURE_NO_WARNINGS
#include 
int main()
{
	char *p = "abcdef";
	printf("%dn", sizeof(p));//4;p为char*类型
	printf("%dn", sizeof(p+1));//4;同上
	printf("%dn", sizeof(*p));//1;p为*char;再解引用为char
	printf("%dn", sizeof(p[0]));//1;p[0]=>*(p+0)得到字符a,
	printf("%dn", sizeof(&p));//4;p为char*,再&得到char**
	printf("%dn", sizeof(&p+1));//4;同上
	printf("%dn", sizeof(&p[0]+1));//4;p[0]得到a,再&得到一个指针
	printf("%dn", strlen(p));//6;有
	printf("%dn", strlen(p+1));//5;从b开始数得到5
	//printf("%dn", strlen(*p));//未定义*p得到一个a类型为char,strlen要的是char*
	//printf("%dn", strlen(p[0]));//同上
	//printf("%dn", strlen(&p));//同上p类型为char*再取地址为char**;
	//printf("%dn", strlen(&p + 1));//同上
	printf("%dn", strlen(&p[0]+1)); //5;p[0]得到'a',再+1得到char*,再+1得到b
}

运行结果: 

 总结:1   sizeof求字节数,strlen找;

        2     指针的内存都是4个字节;

        3      注意运算符的先后顺序;

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/346707.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号