指针笔试题解析(2)

举报
念君思宁 发表于 2023/02/14 21:27:18 2023/02/14
【摘要】 指针笔试题解析(2)

指针对于不少人来说:是多么一个难的代名词呀!!当然这个里面也包括笔者!所以……笔者对于指针满满的后怕!但是也有着更多的期待!毕竟阴影是用来打破的!后怕打破了,也就是龙腾虎跃的时候了!!下面进入正题:

笔者将用代码+解析的方式来带领大家走进:指针!!

 
#include <stdio.h>
int main()
{
	int a[4] = { 1,2,3,4 };
	int* ptr = (int*)(&a + 1);
	int* ptr2 = (int*)(int)(a + 1);
	printf("%x %x\n", ptr[-1], *ptr2);  //4    2
	return 0;
}

注意,笔者的代码是在vs2022 的x86环境下进行演示的!请注意细节,若是在vs2022的x64环境下,将会出现不一样的结果!但那个结果也是正确的!

 若是有老铁能直接看懂,并且能够跟答案对上号,那么这篇博客,这位老铁就没有看的必要了,下面内容主要是对上面的代码的讲解!并不做其他的内容!但若是有兴趣,可以进一步欣赏!
下面进入讲解部分:

对于:%p  :打印地址!

%x  : 以十六进制形式进行打印!
1.(int*)(&a + 1)  : &a取出的是这个数组的地址,&a+1,跳过整个数组,通过int* ptr = (int*)(&a + 1); 赋值给ptr1; 即ptr1 yu  &a+1指向同一位置!

 

2. (int*)(int)(a + 1)  : a是这个数组的数组名,数组名表示首元素的地址!(int)a 是指,a被强制类型转化为:int(整型)!!假设:起始地址为:0x00000015(方便计算),将其转化为整型:1*16的一次幂+5*16的零次幂=21;(int)a+1—》21+1=22;(int*)(int)(a + 1) 再将22认为是一个地址,转化为(int*)类型,地址22为:0x00000016;而0x00000015与0x00000016之间相差一个字节!一个字节一个地址!

3. 假设在VS中是小端存储模式(其实在vs2022中是小端存储)!

数组元素随着下标的变化,由地址到高地址变化!

1的十六进制为:0x00000001;

2的十六进制为:0x00000002;

小端存储模式,(倒着存):低地址放在低地址处!高地址放在高地址处!

int 类型占4个字节!对于数组:int a[4] = { 1,2,3,4 };

 对于:int* ptr = (int*)(&a + 1)  : &a+1之后,强制类型转换为:(int *)整型指针!

对于:int* ptr2 = (int*)(int)(a + 1)  : a是一个数组名,表示首元素的地址!

a的类型为:本来应该为:int *类型,而通过  :(int)(a + 1)  跳过一个字节!即00000002!从而打印出来!!

从而代码的运行结果为:

 由于笔者最近精神不佳!简简单单的一道题!目前已经讲解完毕!接下来,笔者将会给大家,讲解一些 :指针笔试题解析!来供大家参考!!!

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。