C语言学习(二十五)---指针练习题(一)

这篇具有很好参考价值的文章主要介绍了C语言学习(二十五)---指针练习题(一)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

在上一节内容中,我们学习了递归冒泡排序法的有关内容,今天我们将继续往下学习,主要内容为指针练习题,好了,话不多说,开整!!!

在之前的第18—22的内容中,我们学习了指针的一系列内容,今天我们对之前的指针内容进行测试,在查看答案之前,请先自己分析,

不要直接复制代码,然后运行得到结果

因为只有分析了你才知道自己是否是真的掌握了相关内容,下面开始。

一维数组指针题目

分析以下代码的结果:

#include<stdio.h>
#include<string.h>
int main()
{
    int a[] = {1,2,3,4};
    printf("%d\n",sizeof(a+0));
    printf("%d\n",sizeof(*a));
    printf("%d\n",sizeof(a+1));
    printf("%d\n",sizeof(a[1]));
    printf("%d\n",sizeof(&a));
    printf("%d\n",sizeof(*&a));
    printf("%d\n",sizeof(&a+1));
    printf("%d\n",sizeof(*&a[0]));
    printf("%d\n",sizeof(*&a[0]+1));
    return 0;
}

我们知道sieof是求一个数据的所占用的内存空间的函数,其单位为字节

你分析好了吗,分析好了就可以往下看喽,分析如下:

#include<stdio.h>
#include<string.h>
int main()
{
    int a[] = {1,2,3,4};
    printf("%d\n",sizeof(a+0)); //数组名默认首元素地址:加0还是首元素地址,地址为一个指针,因此结果为4字节(32位)
    printf("%d\n",sizeof(*a));//数组名默认首元素地址,解引用也就是数组中的1,其为整型数据,所以为4字节(32位)
    printf("%d\n",sizeof(a+1));//数组名默认首元素地址:加1是数组中第二个元素2的地址,地址4字节
    printf("%d\n",sizeof(a[1]));//数组中第一个元素1的大小,其为整型所以为4字节
    printf("%d\n",sizeof(&a));//&a:为整个数组的地址,既然为地址,就占4个字节(32位)
    printf("%d\n",sizeof(*&a));//对整个数组进行解引用,因此大小为4*4=16字节
    printf("%d\n",sizeof(&a+1));//整个数组的下一位元素的大小:4字节
    printf("%d\n",sizeof(*&a[0]));//取出第一个元素的地址并解引用,整型数据1,4字节
    printf("%d\n",sizeof(*&a[0]+1));//取出第一个元素的地址并解引用,整型数据1,再加1为2,整型2的大小为4字节
    return 0;
}

我们编译查看结果,看看是否分析正确呢

C语言学习(二十五)---指针练习题(一)
从结果中,我们可以看到我们分析是正确的。

字符数组的指针题目

下面进行分析字符数组的相关题目,分为sizeofstrlen题目两个方面的题目。

sizeof题目

首先我们使用sizeof函数,计算字符数组的大小,代码如下:

#include<stdio.h>
int main()
{
    char a[] = {'a','b','v','c','t'};
    printf("%d\n",sizeof(a));
    printf("%d\n",sizeof(a+0));
    printf("%d\n",sizeof(*a));
    printf("%d\n",sizeof(a+1));
    printf("%d\n",sizeof(a[1]));
    printf("%d\n",sizeof(&a));
    printf("%d\n",sizeof(*&a));
    printf("%d\n",sizeof(&a+1));
    printf("%d\n",sizeof(*&a[0]));
    printf("%d\n",sizeof(&a[0]+1));
    return 0;
}

同样,在分析之后再查看以下的分析过程:

#include<stdio.h>
int main()
{
    char a[] = {'a','b','v','c','t'};
    printf("%d\n",sizeof(a)); //数组名放入sizeof内,其代表整个数组,每个字符占一个字节,因此,一共5个字节
    printf("%d\n",sizeof(a+0));//此时a不再代表整个数组,而是数组首元素的地址,加0 还是首元素地址,地址即为4字节(32位)
    printf("%d\n",sizeof(*a));//数组名代表首元素地址,也引用即为字符a,其大小为1字节
    printf("%d\n",sizeof(a+1));//数组名代表首元素地址,加1代表字符b的地址,地址即为4字节(32位)
    printf("%d\n",sizeof(a[1]));//此时表示数组中字符b的大小,1字节
    printf("%d\n",sizeof(&a));//&a代表整个数组的地址,地址即为4字节(32位)
    printf("%d\n",sizeof(*&a));//&a代表整个数组的地址,整个数组解引用即5个字节
    printf("%d\n",sizeof(&a+1));//&a代表整个数组的地址,加1代表此数组后的下一个元素的地址,地址即为4字节(32位)
    printf("%d\n",sizeof(*&a[0]));//取出数组中字符a的地址并解引用,也就是字符a,1字节
    printf("%d\n",sizeof(&a[0]+1));//取出数组中字符a的地址,加1表示字符b的地址,地址即为4字节(32位)
    return 0;
}

我们查看结果:
C语言学习(二十五)---指针练习题(一)
和我们分析的结果一致,因此我们的分析是正确的。

strlen题目

strlen是用来求字符串长度的函数,其统计字符串结束标志'\0'前的字符个数,下面请分析以下代码:

#include<stdio.h>
#include<string.h>
int main()
{
    char a[] = {'a','b','v','c','t','r'};
    printf("%d\n",strlen(a));
    printf("%d\n",strlen(a+0));
    printf("%d\n",strlen(*a));
    printf("%d\n",strlen(a+1));
    printf("%d\n",strlen(a[1]));
    printf("%d\n",strlen(&a));
    printf("%d\n",strlen(&a+1));
    printf("%d\n",strlen(&a[0]+1));
    return 0;
}

自己分析完成后,再看以下的分析:

#include<stdio.h>
#include<string.h>
int main()
{
    char a[] = {'a','b','v','c','t','r'};
    printf("%d\n",strlen(a)); //由于上述这种字符串定义方式并不会自动补充字符串结束标志'\0'
    //因此,其将会直至找到\0位置,所以将打印一个随机值
    printf("%d\n",strlen(a+0));//数组名默认为书元素地址,加0仍然是首元素地址,然后去找\0,仍是一个随机值
    // printf("%d\n",strlen(*a));//对首元素地址解引用,则是字符a,因此将会其对应的ASCII码值的地址开始寻找\0,会产生错误
    printf("%d\n",strlen(a+1));//首元素地址加1,则变为了字符数组中字符b的地址,因此将从b开始寻找结束标志\0,也是一个随机值
    //但该随机值将等前两个随机值-1
    // printf("%d\n",strlen(a[1]));访问数组中的第二个元素,则是字符b,因此将会其对应的ASCII码值的地址开始寻找\0,会产生错误
    printf("%d\n",strlen(&a));//&a代表整个数组的地址,从此地址开始找\0,也是一个随机值,和前两个随机值相同
    printf("%d\n",strlen(&a+1));//从整个数组后的下一个字节开始寻找\0,随机值,但不等于前几个随机值
    printf("%d\n",strlen(&a[0]+1));//&a[0]取出第一个元素的地址,再加1为第二个元素的地址,从此开始寻找\0,其值也为随机值
    //数值和前两个随机值再减一相同
    return 0;
}

如果我们不注释掉其中的两行程序将会中断,如下所示:
C语言学习(二十五)---指针练习题(一)
Linux下,我们可以更清楚的看到其发生了错误,如下:
C语言学习(二十五)---指针练习题(一)

注释后,程序正常运行,如下图所示:
C语言学习(二十五)---指针练习题(一)
发现和我们分析的对上了,因此分析无误。
Ps:
前两天有些事情,因此没有按时更新,以后还是会尽量按时更新,最后

祝大家端午节快乐!!!

上述内容即使今天的全部内容了,感谢大家的观看。
如果方便,辛苦大家点个赞和关注哦!
您的点赞或评论或关注是对我最大的肯定,谢谢大家!!!文章来源地址https://www.toymoban.com/news/detail-496469.html

到了这里,关于C语言学习(二十五)---指针练习题(一)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C语言学习系列-->看淡指针(3)

    在指针的类型中我们知道有⼀种指针类型为字符指针 char* 一般使用: 进阶使用 本质是把字符串 hello ⾸字符的地址放到了pstr中。 把⼀个常量字符串的⾸字符 h 的地址存放到指针变量 pstr 中。 经典例题: 运行结果: 这⾥str3和str4指向的是⼀个同⼀个常量字符串。C/C++会把常量

    2024年02月11日
    浏览(36)
  • C语言-基础语法学习-3 二级指针

    当涉及到多级指针时,C语言的灵活性和强大的指针功能可以得到充分的发挥。二级指针是指指向指针的指针,也被称为指向指针的引用。 使用二级指针可以实现以下功能: 动态内存分配:通过二级指针可以动态地分配内存块,并将其地址传递给其他函数或模块进行操作。这

    2024年02月12日
    浏览(35)
  • rosalind练习题二十二

    # Problem # After identifying the exons and introns of an RNA string, we only need to delete the introns and concatenate the exons to form a new string ready for translation. # Given: A DNA string s (of length at most 1 kbp) and a collection of substrings of s acting as introns. All strings are given in FASTA format. # Return: A protein string resulting from

    2024年02月08日
    浏览(30)
  • C语言指针入门学习、知识点梳理(四)

    本篇内容:指针星号的三种含义以及指针在函数调用时,与实参、形参的变量传递关系,如何通过被调函数修改主调函数普通变量的值。 传送门: C语言指针入门学习、概念梳理(一) C语言指针入门学习、概念梳理(二) C语言指针入门学习、知识点梳理(三) C语言指针入门

    2024年02月09日
    浏览(31)
  • 智能合约学习笔记一 、——{Solidity语言详解——(1—2)小练习}

    1.根据提示,在指定位置写出编译版本,要求使用^符号,版本要求在0.6.0及以上。 2.根据提示,在指定位置写出所定义的合约名称。 3.为了查看程序的效果,我们使用在线 Solidity 开发工具 Remix IDE 编译和运行 Solidity 程序。中文在线版:在浏览器打开下方链接: Remix - 中文版

    2024年02月02日
    浏览(31)
  • C语言-指针进阶-qsort函数的学习与模拟实现(9.3)

    目录 思维导图: 回调函数 qsort函数介绍 模拟实现qsort 写在最后: 什么是回调函数? 回调函数是一个通过函数指针调用的函数。 将一个函数指针作为参数传递给一个函数,当这个指针被用来调用所指向函数时, 我们就将此称为回调函数。 在举例之前,我们先学习一个C语言

    2024年02月15日
    浏览(41)
  • C/C++|物联网开发入门+项目实战|指针|嵌入式C语言高级|C语言内存空间的使用-学习笔记(9)

    参考: 麦子学院-嵌入式C语言高级-内存空间 内存类型资源地址、门牌号的代名词 指针:地址的代名词 指针变量:存放指针这个概念的盒子 *P char *p *p; C语言娟译器对指针这个特殊的概念,有2个疑问? 1、分配一个盒子,盒子要多大? 在32bit系统中,指针就4个字节 2、盘子里存放

    2023年04月22日
    浏览(42)
  • C 语言练习题更新

    目录(先不要看答案,首先自己做才能更好的领悟,做不来没关系) 题目一:有 1、2、3、4 四个数字,能组成多少个互不相同且无重复数字的三位数?都是多少? 程序分析:可填在百位、十位、个位的数字都是 1、2、3、4,组成所有的排列后再去掉不满足条件的排列。 题目

    2024年02月14日
    浏览(36)
  • C语言之练习题

    欢迎来到我的: 世界 希望作者的文章对你有所帮助,有不足的地方还请指正,大家一起学习交流 ! 这期文章由:两题问答题+四道编程题;小孩在文章中写有详细解题思路,感谢大家支持支持。 思路: 首先我们要知道 x=x(x-1) 的含义; 假设x=3;也就是 011 ; 而x-1=2;是 010 ;

    2024年02月10日
    浏览(44)
  • C语言/C++练习题

    题目:从键盘输入年份和月份,输出这个月的天数。 【样例输入】2023 1 【样例输出】31 【样例输入】2020 2 【样例输出】29 提示:当输入的月份为2月份时,需要判断该年年份是否为闰年。 判断闰年的条件:年份为4的倍数并且不是100的倍数,或者年份是400的倍数。 ​ 在控制

    2024年02月06日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包