当前位置: 首页 > news >正文

涉及内存指针位运算例题摘要

1.

int a[5][5];

Int (*p)[4];

p=a;

问其&p[4][2] - &a[4][2]

本题考点为指针数组和地址偏移,int a[5][5];为内存分为5乘5的整形二维数组,Int (*p)[4];为指向四个整形为一组的数组指针,p=a;为两者指向同一块内存首地址,&a[4][2]按照行列划分,意思是取a数组中的第五行第三列,顺序排列就是第4*5+2个元素的地址,&p[4][2]就是将行列分为一行四个元素,顺序排列就是第4*4+2个元素,两者相减,从而得到-4

2.

Void f(char**);

main()

{

char * argv[] = { "ab" ,"cd" , "ef" ,"gh", "ij" ,"kl" };

f( argv );

}

void f( char **p )

{

char* t;

t= (p+= sizeof(int))[-1];

printf( "%s" , t);

}

本题考点为指针和位运算,Void f(char**);为声明有一个f函数,传参为指向字符串指针的指针,char * argv[]为指针数组,定义一个数组,数组里的元素都是char指针,每个元素都用来存字符串的地址,f( argv );为调用f函数,将数组名argv传过去(数组名传参会退化为指针),void f( char **p )指函数f开始,参数为char * argv[]数组的首地址,定义一个字符串指针t,t= (p+= sizeof(int))[-1];中,p为字符串‘ab’地址,sizeof(int)为4,指针向后偏移4位,指向‘ij’,最后[-1],向前偏移一位,指向‘gh’,最后输出‘gh’

3.

double* a[3];

Printf(“%d %d %d”,sizeof(a),sizeof(*a),sizeof(**a));

数组初始化只能放常量/值,不能放变量

本题考点为指针长度与二级指针,a是指针数组,数组有三个元素,每个元素类型都是double类型指针,32位系统中,任意类型指针大小为4字节,64位系统则大小为8字节,sizeof(a)中,a是整个数组(数组名只在sizeof、&和初始化的情况下不会退化成指针),一共三个double类型指针,3*4=12;sizeof(*a)中*a=a[0],指向数组首元素,double类型指针,所以是4;sizeof(**a)中,*a是数组首元素,**a为对数组首元素解引用,得到double类型变量,所以结果为8

4.

Char str[5][12] = {“a”, “bb”, “ccc”, “dddd”};

Char *strp[5];

Int i;

For(i = 0; i < 5; i ++)

{

Strp[i] = str[i];

}

本题考点为指针,Char str[5][12]为定义一个5行12列的二维字符数组,向其中填入字符元素“a”, “bb”, “ccc”, “dddd”,其中一行填入“a”,占1字节,其余11字节置为‘\0’,二行填入“bb”,其余10字节置为‘\0’,依次排列,5行无填入就都置为’\0‘

Char *strp[5];为定义5个char型指针组成的数组,通过后续for的循环,5个指针分别存放5行str中字符串的首地址。

所以要正确引用字符串,则可以写为

Strp[0]:此为指针数组的第0个元素,其中存放“a”的地址,可以直接打印出字符串

*strp:等价于*(a+0)=a[0],其中存放“a”的地址,可以直接打印出字符串

Strp:该为指针数组的数组名,退化后为二级指针,指针数组的首地址,无法直接引用到字符串

Str[1]:此为二维字符数组的第一行的数组名,退化为首地址后,指向“bb”

5.

int *f1(void) int *f2(void) int *f3(void)

{ { {

int x =10; int*ptr; int *ptr;

return(&x); *ptr = 10; ptr=(int*) malloc(sizeof(int));

} return ptr; return ptr;

} }

在int *f1(void)中,x为局部变量,函数执行完毕就销毁,返回值为局部变量的地址,其指向的内容已经销毁,后续使用该指针会导致乱码和非法访问

int *f2(void)中,只定义了指针,没有初始化,向一个随机地址写入数据,会变成野指针,程序会直接崩溃

int *f3(void)中正确分配了堆内存,函数结束不会释放,返回的地址有效,但后续如果未手动释放会造成内存泄漏

6.

程序中要对程序地址0x100000赋值unsigned int的数1234,可以这样写(unsigned int *)0x100000 = 1234;要是想让程序跳到绝对地址0x100000去执行,并且带有int型的参数1234,不关心返回值,应该怎么写?说明理由。

本题考点为函数指针转换

函数包括返回类型,函数名和传参,题目不关心返回值,且传入参数为整形,则可以大概拟定函数原型 void func(int)

其中题目提到(unsigned int *)0x100000 = 1234,该操作为将0x100000强制转换为整型指针,然后赋值1234,说明0x100000可以是一个函数,且函数为void func(int)

然后写一个指向函数的指针原型:void(*p)(int),去掉变量名后,只剩类型,用作类型转换:void(*)(int)

将整形0x100000强制转换为该函数指针:(void(*)(int))0x10000

最后调用函数指针(传参):((void(*)(int))0x10000)(1234)

在c语言里,地址本身就是整数,函数本身也是一段代码,存放于内存地址中,可以使用指针调用,强制转换就是将一个地址整数转换为机器能看得懂的函数

7.

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;

}

本题考点为大小端差异与内存运算

假设a数组各元素的地址分别为

a[0] 0x100

a[1] 0x104

a[2] 0x108

a[3] 0x10C

Int *ptr1 = (int *)(&a + 1);中&a为整个数组的地址,&a+1为跳过整个数组的下一4个int的地址,地址为0x100+4*4=0x110

Ptr[-1]为指针下标向前偏移1个int,结果为0x110-4=1x10C,其地址指向数组元素4

Int *ptr2 = (int *)((int)a + 1);中(int)a把a的首地址强转为整数0x100,后续+1为0x101

然后(int*)将0x101转为int指针

小端内存图为

(int *)((int)a + 1);最终指向数组首地址向后偏移1字节的地址,指针为int型,指向四个字节,又因为小端读取内存数据会把后读到的数据放在前面,所以最终读取结果为0x2000000

大端内存图为

大端读取内存的数据会顺序拼装排列,所以读到的结果为0x00000100

总结:大小端读取数据都是从低地址向高地址读取,不同的是小端会将读取到的数据反向拼接,大端会顺序拼接

http://www.cnnetsun.cn/news/2853013.html

相关文章:

  • 前端八股文面经大全:美团前端暑期实习一面(2026-06-08)·面经深度解析
  • 汕头项目经理,高考后干了3年工地,最后选了室内设计培训,现在自己接项目
  • 如何在AI+iPaaS平台上创建自动化工作流?
  • 【JAVA毕设源码分享】基于springboot综合性旅游服务系统(程序+文档+代码讲解+一条龙定制)
  • Agent与工具调用 - 问题与解决方案
  • LeetCode 128 最长连续序列:从暴力枚举到 O (n) 最优解法全解析
  • 硅谷AI泡沫下:创始人、投资人、工程师各有押注,泡沫逼出五个新判断
  • 食品里虫子尸体投诉赔偿谈不拢,品牌口碑管理里异物处理SOP怎么执行
  • webrtc 音频模块FEC模块
  • 宝塔和云效webhook配置
  • Typora插件开发指南:打造专属IDE式写作环境
  • 涡喷发动机及其延伸应用(二)
  • 01-PyTorch加载数据初认识(dataset运用)
  • 端口协议和rtl的对应
  • 英国首相计划下周宣布新政策:禁止16岁以下儿童用社交媒体,防儿童收发裸照
  • 售价64.99美元!OtterBox Sole系列保护壳升级,可收纳小物件
  • GoF设计模式——桥接模式
  • 互联网大厂 Java 求职面试实录:从音视频场景到微服务的探讨
  • 【2026最新】降AI率抄作业:97%→7%的完整方法论,亲测有效直接搬
  • 终极文件提取方案:UniExtract2 支持500+格式的万能解包工具
  • 华硕笔记本性能调校新选择:如何用G-Helper告别臃肿控制软件
  • shmem共享内存管理库完全指南:从核心概念到实战应用的系统性入门
  • 模块化小说下载系统架构深度解析与实战实现方案
  • 给开发者的可信计算入门:抛开晦涩规范,用‘信任链’和‘钩子’理解TPM/TPCM到底在干嘛
  • 2025-2026手机解压RAR工具深评
  • 终极指南:3329条专业翻译,让MASA模组全家桶彻底告别英文界面困扰
  • 粉笔事业单位和华图哪个好?事业编备考看公基、职测、综应和模考复盘
  • 不用买服务器!用家里旧电脑+花生壳内网版,5步搞定个人网站(附IIS配置避坑点)
  • 【Kafka源码解读和使用指南】第28篇:ConsumerCoordinator源码解析——消费者与GroupCoordinator的“谈判桌“
  • Ultralytics发布YOLO26:让实时视觉检测更快更准的新“千里眼“