0
点赞
收藏
分享

微信扫一扫

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

自由情感小屋 2022-04-19 阅读 61

前言

当我刚刚学完指针的时候,感觉自己已经非常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 <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


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

举报

相关推荐

0 条评论