新手一看就会的C语言指针练习题——做题更容易理解

新手一看就会的C语言指针练习题——做题更容易理解,第1张

新手超易会的C语言指针练习题——做题更容易理解 上一个博客留下来的题目

上一篇博客(如果没有看,最好先查看一下更容易上手)
新手一看就懂——指针知识点总结

题目一:
char arr[] = "abcdef";
printf("%d\n", sizeof(arr));
printf("%d\n", sizeof(arr+0));
printf("%d\n", sizeof(*arr));
printf("%d\n", sizeof(arr[1]));
printf("%d\n", sizeof(&arr));
printf("%d\n", sizeof(&arr+1));
printf("%d\n", sizeof(&arr[0]+1));
printf("%d\n", strlen(arr));
printf("%d\n", strlen(arr+0));
printf("%d\n", strlen(*arr));
printf("%d\n", strlen(arr[1]));
printf("%d\n", strlen(&arr));
printf("%d\n", strlen(&arr+1));
printf("%d\n", strlen(&arr[0]+1));
————————————————
版权声明:本文为CSDN博主「王少climax」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_43635473/article/details/126831122
题目二:
char *p = "abcdef";
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));
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));
————————————————
版权声明:本文为CSDN博主「王少climax」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_43635473/article/details/126831122
题目一的讲解:

char arr[] = “abcdef”;
//已经定义了一个字符串,是字符串不是字符数组(两者差异在字符串是用双引号“”包裹起来的,而且默认是以‘arr));//’结尾的,但是‘有错误的已经屏蔽掉了,不然无法运行看到其他结果’不会显示出来。

printf(“%d\n”, sizeof(arr)); //sizeof 是运算符,算的是内容所占字节数的多少,sizeof(数组名)中数组名代表整个数组的大小,arr中有7个char类型(不要忘记‘\0’)
所以等于7
printf(“%d\n”, sizeof(arr+0));// arr+0=&arr[0] 所以取得是地址,老规矩:32位是4字节,64位是8字节,以下都用4/8表示
printf(“%d\n”, sizeof(已经定义了一个字符串,p存放的是字符串的首字母地址,是字符串不是字符数组(两者差异在字符串是用双引号“”包裹起来的,而且默认是以‘’结尾的,但是‘’不会显示出来。 * arr= * &arr[0]=arr[0] 所以等于sizeof(arr[0])=1
printf(“%d\n”, sizeof(arr[1]));//与上一个相同 =1
printf(“%d\n”, sizeof(&arr));//&arr代表取得是整个字符串的地址,只要是地址就是 4/8
printf(“%d\n”, sizeof(&arr+1));//&arr+1表示邻近这个数组紧挨着的一个地址,还是地址=4/8
printf(“%d\n”, sizeof(&arr[0]+1));//arr[0]的地址往后加一位=arr[1]的地址,还是地址=4/8

答案结果:

printf(“%d\n”, strlen(arr));//strlen是库函数,需要引用头文件string.h,测量的是字符串的长度,以见到‘\0’为测量结束标志。所以arr中在第一个\0出现之前有6个字符,所以=6
printf(“%d\n”, strlen(arr+0));//arr+0=&arr[0],与上一题其实是一样的=6
printf(“%d\n”, strlen(*arr));// * arr= * &arr[0]=’a‘,也就是a的ASCII值’97‘,97是不能被访问的(之后再讲),所以会报错 err
printf(“%d\n”, strlen(arr[1]));//和上一问一样,访问了’b‘的ASCII值,err
printf(“%d\n”, strlen(&arr));//&arr取得是整个数组的地址,但是也是从&arr[0]开始计算的,还是6
printf(“%d\n”, strlen(&arr+1));&arr+1就是取得arr数组结束后下一个数组的地址了,因为不确定系统内容存的内容,有可能会碰到’\0’,所以是随机数
printf(“%d\n”, strlen(&arr[0]+1));这就代表从arr[1]的地址往后计算,应该等于5

答案结果:


题目二的讲解:

char *p = “abcdef”;
//)
printf(“%d\n”, sizeof§);p=首字母地址,地址在sizeof中就是4/8(已经有默契了)
printf(“%d\n”, sizeof(p+1));p+1还是地址=4/8
printf(“%d\n”, sizeof(*p));等价于 * &p[0]=p[0]='一个字符’=一个字节=1
printf(“%d\n”, sizeof(p[0]));与上一个一样=1
printf(“%d\n”, sizeof(&p));指针的地址,还是地址=4/8
printf(“%d\n”, sizeof(&p+1));依旧是地址=4/8
printf(“%d\n”, sizeof(&p[0]+1));这是p[1]的地址=4/8

答案(x86架构下):

答案(x64架构下):

printf(“%d\n”, strlen§);p是字符串首字母地址,计算到第一次见到’\0’为止=6
printf(“%d\n”, strlen(p+1));p+1指的是这一个字符串结束后的地址,随机数
printf(“%d\n”, strlen(*p));取得是‘a’的ASCII值,禁止访问 err
printf(“%d\n”, strlen(p[0]));和上一个一样,err
printf(“%d\n”, strlen(&p));取得是p这个指针的地址,但是不知道内存指的是什么地方,随机数
printf(“%d\n”, strlen(&p+1));同上一样,指针的地址=随机数
printf(“%d\n”, strlen(&p[0]+1));同上=随机数

欢迎分享,转载请注明来源:内存溢出

原文地址:https://www.54852.com/langs/2990656.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-09-23
下一篇2022-09-23

发表评论

登录后才能评论

评论列表(0条)

    保存