编辑:之前提出的类似问题没有解决与该问题相关的一些观点。

在Kernighan和Ritchie的ANSI C书中,他们说以下是等价的

  • a[i]
  • *(a+i)

我不知道如何占用多个地址空间的元素,例如结构。

请解释? 编辑:谢谢你的所有答案,但我不太明白。 看起来我和@CucumisSativus的答案和评论都有同样的困惑。

假设sizeof(* a)是3.如果由于某种原因我想访问a中第一个元素的中间字节,我原以为这就是我要做的: *(a+1)

说的地址, a是10,sizeof运算每个元素是20,说我们想要得到的指针的第二个元素。 在我看来,我们可以这样做:p =(10 + 20)。 我认为这相当于&a[1]

我真的很难解释我不理解的东西!!

===============>>#1 票数:6

指针运算的处理方式与C中的常规整数运算不同。将整数i添加到指针p使存储器地址增加i * sizeof(*p) ,即i 型指向的类型大小

作为一个潜在的有趣但实际上无用的旁注:由于p[i]定义为*(p+i) ,表达式i[p]也等同于......

===============>>#2 票数:3

+运算符不是地址空间中的下一个元素

增量由所涉及的数据类型大小定义。 因此, a + 1将参考下int如果a是指向的整数,并且将参考下struct ,如果a是一个指向struct

===============>>#3 票数: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个字节。

===============>>#4 票数:0

a + i在伪代码中被翻译成类似的东西

  *(a+i*sizeof(variableType))

===============>>#5 票数:0 已采纳

我阅读了更多的K&R,发现了拼图中缺失的部分,让我能够理解正在发生的事情。 (无论我是否正确,都可以辩论!)

从我收集的内容来看,以下内容无效:

p = (10 + 20)
  • 鉴于此,引用: “指针和整数不可互换。零是唯一的例外。”
  • 我将其解释为*(a + i) 执行直接整数运算。
  • 我相信这种行为是由表达式中指针的存在决定的。

并再次引用K&R,并提供给我的问题的其他答案,算术算法的确切行为涉及:

  1. 一个指针
  2. 一个或多个整数

for(p + n)的定义如下:“ n根据p指向的对象的大小进行缩放,这由p的声明决定 ”。

我意识到是什么原因导致我如此困惑:我过去能够使用printf()输出指针的实际地址值。 我相信这是“未定义的行为”,我正在使用的编译器通过将指针视为整数来处理。

类似地,鉴于上面两个编号的项目符号和使用它们的定义,我认为将两个指针(相同类型)添加在一起会导致未定义的行为,更确切地说,添加两个不同类型的指针。

要获取整数的第n个字节,请参阅此问题

K&R后来补充说以下是合法的指针操作:

  • 将一个指针指向另一个指针(相同类型)
  • 添加或减去指针和整数
  • 从另一个指针中减去一个指针(到同一个数组)
  • 比较指针(到同一个数组)
  • 分配/比较为0

所有其他指针算法都是非法的。

  ask by CL22 translate from so

未解决问题?本站智能推荐:

2回复

指向数组的C指针

我有一个大小为240x320字节的数组,指向该缓冲区的指针存储在内存地址0xE30014中。 我试图定义如下: 因为我希望能够以这种方式对数组建立索引: 但是,这引发了一个错误,即数组不是合法的左值。 我想知道当前定义有什么问题吗? 任何帮助深表感谢。
3回复

c / c ++指向数组的指针与指向指针的指针

在运行此程序之前,我认为数组和指针基本上是同一件事: 输出为: 有人可以解释一下为什么&b的输出与b相同吗? 谢谢! -埃尔本
1回复

指向数组指针元素的指针

我正在做一个项目,我在理解逻辑上遇到问题。 我希望有人可以向我解释一下,或者至少让它更加清楚。 如果数据结构有所更改,则它是哈希表。 码: 只要我理解这一点, tHT[]是指向结构tHTElem的指针数组? 因此,如果我想创建指向该数组一个元素的指针,我应该像这样创建它吗?
3回复

C-指向指针数组的指针

我正在学习C,因为我陷入了指针章节。 指向指针(** p)的指针的部分,用于处理2维数组。 以下函数生成一个2维数组,其所有元素均等于0。 函数返回的tr是指向tr数组第一个元素的“双指针”吗? 还是要其价值? 另外,现在(在调用函数之后)如何在** tr指向的内存部分访问数
3回复

C数组和指向数组的指针

我有一个简单的问题..我有一个C程序..我有一个long数组,我想将指向该数组的指针传递给两个函数。 以这种方式传递数组是否正确? 是正确的吗?
4回复

指向数组中第一个元素的指针! (C)

我是C的新手。 我知道这有多种形式的问题,但我的有点独特......我想。 我有一个无符号的短指针。 数组声明如下: const unsigned short myArray[1024]并且是一个十六进制数的数组,形式为0x0000,依此类推。 我尝试编译,它抛出这些错误:
2回复

指向数组最后一个元素的C指针

可以说我们有一个数组 int a[4]; 使用指针算法找到最后一个元素有一个巧妙的技巧。 据我所记得,它使用的是'a'的地址并递增它,以便它将立即指向数组之后的点,然后返回一个位置。 增量背后的想法是,存在一个隐式的sizeof 。 没有任何明确的sizeof 。 有人知
10回复

指向数组的指针

我想知道,你能指出一个数组中的一组变量吗? 像这样 所以你可以说...... 和 和*指针的长度 好 让我解释一下我想要完成的事情,也许这会让我有所了解。 我想将一个完整的文件读入一个缓冲区,但我想要一块一块地完成。 将一个小数组传递给read()然后
1回复

指向数组的指针

我找到了一个指向数组的指针的例子,这对我来说没有多大意义,我想知道是否有人可以帮助我? 我不确定第三行p [3] = 1的工作方式以及如何导致a [3] =6。感谢您的提前帮助。
3回复

C语言编程。 指针数组和指向数组的指针

为什么在以下代码中出现编译错误? 和int (*p)[4] , int *p[4]和int *(p)[4]什么区别?