大家好呀!👋这个是付青云同学的博客,是一名大一在校生哦!😁😁
目前一直在学习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
肝不动了肝不动了,剩下四个题目我发在下一篇吧🥲
这个是后四题
创作不易,如果对你有帮助的话不妨来个三连?😁😎