棘手的指针问题[英] Tricky pointer question

本文是小编为大家收集整理的关于棘手的指针问题的处理方法,想解了棘手的指针问题的问题怎么解决?棘手的指针问题问题的解决办法?那么可以参考本文帮助大家快速定位并解决问题。

问题描述

我在过去的C中遇到麻烦 y2007p3q4.pdf

问题是:

C程序员正在与 小型机器,有8位 字节和一个单词中的4个字节.这 编译器支持非对齐的访问和 使用1、2和4个字节存储char, 分别简短和插入.这 程序员写以下 定义(右下方)访问 主内存中的值(左下):

地址字节偏移
---------- 0 -1-- 2-- 3
0x04 | 10 00 00 00
0x08 | 61 72 62 33
0x0c | 33 00 00 00
0x10 | 78 0C 00 00
0x14 | 08 00 00 00
0x18 | 01 00 4C 03
0x1c | 18 00 00 00

int **i=(int **)0x04;  
short **pps=(short **)0x1c;  

struct i2c {  
int i;  
char *c;  
}*p=(struct i2c*)0x10;

(a)写下以下C表达式的值:

**i  
p->c[2]  
&(*pps)[1]  
++p->i  

我得到

**i == 0xc78  
p->c[2] == '62'  
++p->i == 0x1000000  

我不明白第三个问题(&(*pps)[1]),有人可以解释一下这里发生了什么吗?我知道PPS指针已被删除,但随后将操作员的地址应用于该值.这不是像问一个常数的地址一样,例如,如果我这样做

int i = 7;  
int *p = &i;
&(*p)   //would this mean address of 7??  

事先感谢您的任何帮助.

推荐答案

[]操作员优先于&操作员.因此,该代码正在提取pps以获取short*数组的第一个元素.由于此元素也是指针,因此我们可以将其视为一个数组,并将指向指向的右侧位置查找一个位置,wth [1].最后,我们采用该元素的地址.

注意,&p[i]与p + i相同 - 它为您提供指向元素i位置的指针,p指向.

.

中间值是:

pps == 0x1c
*pps == 0x18
&(*pps)[1] == *pps + 1 == 0x1A

(+1添加两个字节,因为它用于short*)

其他推荐答案

表达式解析为&((*pps)[1]); pps被视为指向数组的指针,您正在访问该尖端数组的第一个元素,然后访问该元素的地址.

其他推荐答案

pps是指向简短指针的指针,

这意味着*pps是短(或短裤数组)的指针,

(*pps)[1]就像*(*pps + 1) [指针算术],

和&(*(*pps + 1))是*(*pps+1)的地址,

或,换句话说 - (*pps+1)(这是一个指向简短的指针).

本文地址:https://www.itbaoku.cn/post/359149.html