编辑:之前提出的类似问题没有解决与该问题相关的一些观点。
在Kernighan和Ritchie的ANSI C书中,他们说以下是等价的
a[i]
*(a+i)
我不知道如何占用多个地址空间的元素,例如:结构
请解释一下?编辑:谢谢你的所有答案,但我不太明白。看起来我和@CucumisSativus的答案和评论都有同样的困惑。
假设sizeof(* a)是3.如果由于某种原因我想访问a中第一个元素的中间字节,我原以为这就是我要做的:*(a+1)
。
假设a
的地址是10,每个元素的大小是20.并且说我们想要获得指向第二个元素的指针。在我看来,我们可以这样做:p =(10 + 20)。我认为这相当于&a[1]
。
我真的很难解释我不明白的事情!!
答案 0 :(得分:6)
指针运算的处理方式与C中的常规整数运算不同。将整数i
添加到指针p
会使内存地址增加i * sizeof(*p)
,即i
乘以指向的类型的大小。
作为一个潜在有趣但实际上无用的旁注:由于p[i]
定义为*(p+i)
,表达式i[p]
也等同于...... {/ p>
答案 1 :(得分:3)
+
运算符并不意味着地址空间中的下一个元素。
增量由所涉及的数据类型的大小定义。因此,如果a + 1
是指向整数的指针,int
将引用下一个a
,如果struct
是指针,则a
将引用下一个struct
到{{1}}。
答案 2 :(得分:1)
假设我们有一个Integer指针和一个Character指针,如下所示
int * a; char * b;
现在假设a存储在10000位置 和b存储在位置20000
通过执行以下操作
*(a+1) : It will return the value contained in address 10004 i.e. (10000+4)
*(b+1) : It will return the value contained in address 20001 i.e. (20000+1)
原因:
指针添加与常规算术添加不同。如果将1添加到整数指针,则会将指针按整数的大小前进到某个位置。因此,在这种情况下,它将指针前进到10004.由于字符只有1个字节长,所以它将指针前进1个字节。
答案 3 :(得分:0)
a + i在伪代码
中被翻译成类似的东西 *(a+i*sizeof(variableType))
答案 4 :(得分:0)
我阅读了更多关于K& R的内容,发现了这个难题的缺失部分,让我能够理解正在发生的事情。 (无论我是否正确,都可以辩论!)
从我收集的内容来看,以下内容无效:
p = (10 + 20)
再次引用K& R,并提供给我的问题的其他答案,算术算法的确切行为包括:
定义如下:“ n根据p指向的对象的大小进行缩放,这由p 的声明确定。”
我意识到是什么原因导致我如此困惑:我过去能够使用printf()
输出指针的实际地址值。我相信这是“未定义的行为”,我正在使用的编译器通过将指针视为整数来处理。
同样,鉴于上面两个编号的项目符号点以及使用它们的定义,我认为将两个指针(相同类型)添加在一起会导致未定义的行为,更确切地说,添加两个不同类型的指针。 / p>
要获取整数的第n个字节,请参阅this question。
K& R后来补充说以下是合法的指针操作:
所有其他指针算法都是非法的。