当前位置: 首页 > 知识库问答 >
问题:

通过指针算法计算数组长度

华景焕
2023-03-14

我想知道*(&array+1)实际上是如何工作的。我认为这是一种计算数组长度的简单方法,并希望在使用它之前适当地理解它。我对指针算术不是很有经验,但根据我的理解,&array给出了数组第一个元素的地址。(&array+1)将按地址转到数组的末尾。但是*(&array+1)不应该给出这个地址的值吗。而是打印出地址。我真的很感激你帮我把指针的东西弄清楚。

下面是我正在研究的一个简单示例:

int numbers[] = {5,8,9,3,4,6,1};
int length = *(&numbers + 1) - numbers;

共有1个答案

程城
2023-03-14

(这个答案是针对C++的。)

  1. &numbers是指向数组本身的指针。它的类型为int(*)[7]
  2. &numbers+1是指向数组后面的字节的指针,另一个数组7ints将位于该字节后面。它仍然具有int(*)[7]类型。
  3. *(&numbers+1)取消引用此指针,生成类型为int[7]的lvalue(引用数组后面的字节)。
  4. *(&numbers+1)-numbers:使用-运算符强制两个操作数进行数组到指针的转换,因此可以减去指针。*(&numbers+1)转换为指向数组后面字节的int*numbers转换为指向数组第一个字节的int*。它们的区别是两个指针之间的int的数目--这是数组中int的数目。

编辑:虽然&numbers+1没有指向有效的对象,但这就是所谓的“过去结束”指针。如果p是指向t的指针,指向t类型的有效对象,则计算p+1始终有效,即使*p可能是单个对象或数组末尾的对象。在那种情况下,您得到一个“pass the end”指针,它不指向有效的对象,但仍然是一个有效的指针。您可以使用这个指针进行指针算术,甚至可以取消引用它以产生一个lvalue,只要您不尝试读取或写入该lvalue。请注意,您只能在对象的末尾加长一个字节;试图更进一步会导致不明确的行为。

 类似资料:
  • 假设我有一个如下数组: 我想从上面的数组中创建一个新数组,其中每个元素的字符大小应该是 因此,我必须一个接一个地连接元素,计算 循环将持续到的最后一个索引。 我还确定了任何元素的大小是否为 预期输出如下: 所以,再一次,要求是短裤: 从一个给定的数组中创建一个新数组,通过连接元素和新数组元素的字符大小应该是

  • 正如主要章节中所解释的,Objective-C指针是一个地址,它是一个数值。 因此,您可以像对数值一样对指针执行算术运算。 可以在指针上使用四个算术运算符:++, - ,+和 - 要理解指针运算,让我们考虑ptr是一个整数指针,它指向地址1000.假设32位整数,让我们对指针执行以下算术运算 - ptr++ 现在,在上述操作之后, ptr将指向位置1004,因为每次ptr递增时,它将指向下一个整

  • 指针是算术表达式、赋值表达式和比较表达式中的有效操作数。但是,通常并不是这些表达式中使用的所有运算符都在指针变量中有效。本节介绍可以用指针操作数的运算符及这些运算符的用法。 只有少量操作可以对指针进行。指针可以自增(++)或自减(--),整数可以加进指针中(+或+=),也可以从指针中减去整数(-或-=),指针可以减去另一指针。 假设声明了数组 int v[5] ,其第一个元素位于内存地址 3000

  • 我的大学作业有点问题。我真的不明白指针和引用是怎么回事。有人能指出我哪里出错了吗??

  • 问题内容: 考虑到您可以(无法想到一种放置它的好方法,但是)在Go中操作指针,是否有可能像在C中那样执行指针算术,例如遍历数组?我知道循环对于这些事情来说现在很好,但是我很好奇是否可能。 问题答案: 否。来自“常见问题解答”: 为什么没有指针算术? 安全。如果没有指针算术,就有可能创建一种永远不会派生出不正确地址的语言。编译器和硬件技术已经发展到可以使用数组索引的循环与使用指针算术的循环一样高效的