C语言指针笔试题全面解析

目录

  • 前言
  • 一、指针笔试题
    • 1.题目如图:
    • 2.题目如图:
    • 3.题目如图:
    • 4.题目如图:
    • 5.题目如图:
    • 6.题目如图:
    • 7.题目如图:
    • 8.题目如图:
  • 总结

    前言 通过8道指针笔试题的解析,可以充分的复习到指针的相关知识,并且题目中会结合许多之前的相关知识,希望通过本篇文章,对大家所学的知识进行一个复习。
    提示:以下是本篇文章正文内容,下面案例可供参考

    一、指针笔试题
    1.题目如图:
    C语言指针笔试题全面解析
    文章图片

    逐条语句分析:
    ①.定义了一个大小为5的整型数组,并进行了初始化
    ②.定义了一个整型指针变量ptr用来存放地址,这里的存放地址是(&a+1)的地址,由于是&a,所以表示的是整个数组a,所以&a+1跳过的是整个数组,这里的地址是a数组后面的一块随机变量地址。因为指针指向的是整个数组,所以它的类型是int(*)[5](数组指针),所以我们在它的前面进行强制类型转换,把它转换为(int*)类型,然后再存放到指针变量ptr内部。
    ③.打印出来对应的*(a+1)和*(ptr-1)的数值
    图解:
    C语言指针笔试题全面解析
    文章图片

    运行结果:
    C语言指针笔试题全面解析
    文章图片


    2.题目如图:
    C语言指针笔试题全面解析
    文章图片

    逐条语句分析:
    ①.定义一个结构体变量,供我们一会使用
    ②.p是一个地址,没有对它进行任何的改变,所以就是用16进制去进行加减操作即可,0x1就是十六进制的1,所以可以理解为p+1,打印出来对应的十六进制的地址,因为结构体的大小为20个字节,所以+1就是跳过整个结构体,就是加上整个结构体的大小,即对应的p的地址+20得到新的地址打印出来,这里加上的20是十进制我们需要把它转换为十六进制的数,即对应p的地址加上0x00000014即可
    ③.p在这里进行了一步无符号长整型的强制类型转换,然后再加上0x1(即十进制的1),我们想既然我们把p类型转换为了一个整型,所以+1就是单纯的+1,我们举一个简单的例子,10和1都是整型数据,10在内存的存储是0x0000000A,1在内存的存储是0x00000001,10+1 = 11 ,11对应的内存存储是0x0000000B,所以我们知道了两个整型相加,对应的地址就是+1
    ④.p在这里进行了一步无符号整型指针的强制类型转换,然后再加上0x1(即十进制的1),我们想既然我们把p类型转换为一个整型指针,所以加+1,跳过的是一个整型指针变量,一个整型指针变量的大小为4,所以+1对应的地址就是+4
    运行结果:
    C语言指针笔试题全面解析
    文章图片


    3.题目如图:
    C语言指针笔试题全面解析
    文章图片

    逐条语句分析:
    ①.定义一个大小为4的整型数组,并且进行了初始化
    ②.定义一个整型指针变量ptr1存放的是变量的地址,这个地址与第一题的方法一致在这里不再重复,向上看第一题即可
    ③.这里的a单独放在括号内,代表的是数组的首元素地址,类型是(int*),在a的前面有一步强制类型转换把int*类型转换为了整型(int类型)加+1后,我们由上一题可以知道整型的数值+1地址也是+1个字节,然后再一步强制类型转换把它转换为int*的类型,把地址存储到指针变量ptr2中
    ④.注意这里的是%x是以十六进制的方法打印出来ptr[-1]和*ptr2
    图解:
    C语言指针笔试题全面解析
    文章图片

    运行结果:
    C语言指针笔试题全面解析
    文章图片


    4.题目如图:
    C语言指针笔试题全面解析
    文章图片

    逐条语句分析:
    ①.定义了一个3行2列的二维数组,并且进行了初始化,我们看到这里面的元素,都是用圆括号括起来的,所以这里的是逗号表达式,我们知道逗号表达式的数值是取最后一个元素,所以就相当于我们的数组元素只有{1,3,5}其他的的位置没有初始化数值就都是0,所以就相当于我们的数组就是这样的int a[3][2] = {1,3,5,0,0,0}
    ②.定义一个指针变量p
    ③.指针变量p用来存放a[0]的地址,我们注意到这里的a[0],既没有&a[0]也没有sizeof(a[0]),所以这里的a[0]就是数组的首元素地址就是a[0][0]的地址,即就是数字1的地址,所以指针变量p存放的就是a[0][0]元素的地址
    ④.打印出来p[0]对应的元素数值,我们知道p[0] = *(p+0)所以就是对应a[0][0]的数值
    图解:
    C语言指针笔试题全面解析
    文章图片

    运行结果:
    C语言指针笔试题全面解析
    文章图片


    5.题目如图:
    C语言指针笔试题全面解析
    文章图片

    逐条语句分析:
    ①.定义一个二维数组。
    ②.定义一个数组指针。
    ③.将二维数组首地址赋值给数组指针,我们看到这里的类型是int(*)[4],而二维数组明显是有5列的所以明显这个数组指针不能存储整个二维数组,只能存储一部分。
    ④.打印出来地址的差值对应的地址,以及对应的差值数值。
    图解:
    C语言指针笔试题全面解析
    文章图片

    运行结果:
    C语言指针笔试题全面解析
    文章图片


    6.题目如图:
    C语言指针笔试题全面解析
    文章图片

    逐条语句分析:
    ①.定义一个二维数组并进行初始化
    ②.定义一个指针变量ptr1存放的是变量的地址,我们看到这里的数组名是被&的,我们知道&数组名是表示的整个数组,所以&aa+1跳过的是整个数组,因为这里指向的是整个数组对应的类型就是int (*)[5],所以我们需要进行一步强制类型转换,把它转换为(int*)类型存储到指针类型变量ptr2中
    ③.这里的aa没有&符号,也没有在sizeof内部,所以这里的aa是首元素地址,因为是一个二维数组,所以首元素地址是第一行的地址,+1后跳到了第二行
    ④.打印出来*(ptr1-1)和*(ptr2-1)的数值
    图解:
    C语言指针笔试题全面解析
    文章图片

    【C语言指针笔试题全面解析】运行结果:
    C语言指针笔试题全面解析
    文章图片



    7.题目如图:
    C语言指针笔试题全面解析
    文章图片

    逐条语句分析:
    ①.定义一个字符指针数组,并进行了初始化
    ②.定义一个二级指针存放的是字符指针数组元素的首地址
    ③.二级指针++跳个一个元素的地址,指向的是下一个元素的地址
    ④.打印出来*pa对应的元素
    图解:
    C语言指针笔试题全面解析
    文章图片

    运行结果:
    C语言指针笔试题全面解析
    文章图片


    8.题目如图:
    C语言指针笔试题全面解析
    文章图片

    逐条语句分析:
    ①.定义一个字符指针数组,并初始化
    ②.定义一个字符指针数组(二级指针),并初始化
    ③.定义一个三级指针指向cp字符指针数组
    ④~⑦按要求去打印数值
    图解:
    C语言指针笔试题全面解析
    文章图片

    运行结果:
    C语言指针笔试题全面解析
    文章图片


    总结 本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注脚本之家的更多内容!

      推荐阅读