> 文档中心 > 你的指针学到什么层次了?8个指针题目让你加深对指针的理解(上)O.O

你的指针学到什么层次了?8个指针题目让你加深对指针的理解(上)O.O


大家好呀!👋这个是付青云同学的博客,是一名大一在校生哦!😁😁
目前一直在学习C语言。🐸
写博客是为了来记录我的学习过程,同时也希望通过博客能够帮助到需要帮助的人。
如果我的博客可以帮助到你,不妨给我一个关注哦😁

前言

当我刚刚学完指针的时候,感觉自己已经非常np了,但是一写起来关于指针的题目时,却总是写不出来。实际上,即使我们已经学完了指针的知识,但是没有实战的话总归是没用的。
所以,这不就来题目了。

文章目录

  • 前言
  • 指针题目
    • 第一题🤨
      • 🫱解析🫲
    • 第二题🤨
      • 🫱解析🫲
    • 第三题🤨
      • 🫱解析🫲
    • 第四题🤨
      • 🫱解析🫲

指针题目

第一题🤨

int main(){ int a[5] = { 1, 2, 3, 4, 5 };    int *ptr = (int *)(&a + 1);    printf( "%d,%d", *(a + 1), *(ptr - 1));    return 0;}

先自己尝试看看吧!


🫱解析🫲

首先,在这里,*(a+1)代表a[1],易知这个为数组的第二个元素(2);
然后,我们要知道:&a取的是数组a的整个数组的地址,所以&a+1就是下一个元素的地址,长度为数组a的长度,如图:
在这里插入图片描述

但是,这里它又将&a+1强制转换为int*类型,所以长度变为4个字节,所以ptr-1就往前移动了4个字节(一个元素),如图:
请添加图片描述
所以,最后它打印的就是2,5


第二题🤨

struct Test{int Num;char* pcName;short sDate;char cha[2];short sBa[4];}*p;//假设p 的值为0x100000。 如下表表达式的值分别为多少?int main(){printf("%p\n", p + 0x1);printf("%p\n", (unsigned long)p + 0x1);printf("%p\n", (unsigned int*)p + 0x1);return 0;}

先自己尝试看看吧!


🫱解析🫲

通过计算结构体Test类型的变量大小是20个字节
我们一个一个分析

printf("%p\n", p + 0x1);//在这里,p代表结构体地址,0x1为十六进制的1//所以在这里的意思就是跳过一个结构体的长度(20字节)=0x100000+20//打印的就是0x100014(注意这个是16进制)
printf("%p\n", (unsigned long)p + 0x1);//在这里,p被强制转换为无符号长整形的类型,整型加一,就是直接加一//=0x100000+1//打印的就是0x100001
printf("%p\n", (unsigned int*)p + 0x1)///在这里,p强制转换为无符号整型指针的类型,加一加的就是4个字节//所以=0x100000+4//打印的就是0x100004

第三题🤨

int main(){    int a[4] = { 1, 2, 3, 4 };    int* ptr1 = (int*)(&a + 1);//表示跳过一个指针数组的长度    int* ptr2 = (int*)((int)a + 1);//表示将地址+1,再转换成int指针的类型    printf("%x,%x", ptr1[-1], *ptr2);    //[-1]减的是一个指针长度(-4字节)=3        return 0;}

先自己尝试看看吧!


🫱解析🫲

int* ptr1 = (int*)(&a + 1);printf("%x", ptr1[-1]);//%x表示打印16进制整数//这题与第一题有些相似,ptr1为数组a最后一个元素(4)的地址//ptr1[-1]我们可以看成*(ptr-1),所以也就是打印数组中3的地址//详情可以看第一个题目
int* ptr2 = (int*)((int)a + 1);//表示将地址+1,再转换成int指针的类型printf("%x", *ptr2);//在这里,a被强制转换为整型,所以(int)a + 1就是将a的地址加一(假如a地址为0x0012ef12,+1=0x0012ef12),然后再转换为整型指针类型//所以ptr2的地址就是a的首元素地址+1,这个地址所指向的是一个未定义的数

第四题🤨

#include int main(){    int a[3][2] = { (0, 1), (2, 3), (4, 5) };    int* p;    p = a[0];    printf("%d", p[0]);    return 0;}

先自己尝试看看吧!


🫱解析🫲

首先,你要注意,这里有个坑:数组a里面的是括号。所以实际上数组a里面的元素就是1 3 5 0 0 0
然后整型指针p=a[0],a[0]就是数组a的首元素的地址,所以p[0]也就相当于*p
所以最后打印的就是0


肝不动了肝不动了,剩下四个题目我发在下一篇吧🥲
这个是后四题
创作不易,如果对你有帮助的话不妨来个三连?😁😎

医疗百科