你的指针学到什么层次了?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);
    printf("%x,%x", ptr1[-1], *ptr2);
    return 0;
}

先自己尝试看看吧!


🫱解析🫲

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

第四题🤨

#include <stdio.h>
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


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

评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

付青云同学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值