【问题标题】:Make a pointer point to the beginning of array c++使指针指向数组c ++的开头
【发布时间】:2015-12-09 00:16:08
【问题描述】:

假设您已将指针传递给数组中的某个 kth 元素,并且您希望搜索该数组。如何使该指针指向数组的开头?这是我的意思的伪代码:

main(){
    int arr[5]{1,2,3,4,5};
    subRoutine(arr+2); //
}

void subRourtine(int * ptr){
    while(ptr){
        ++ptr; //This only work if i'm looking for an element that is after ptr
    }
}

【问题讨论】:

  • 当你只有一个指向数组内部某处的指针时,你无法知道数组的开头在哪里,除非数组数据本身在开头包含一个标记值。最好传递一个指针一个偏移量(和一个大小)。
  • 为什么不同时传递一个int * end_ptr
  • 我知道传递长度更好,但由于多种原因我无法添加参数
  • 请注意while(ptr) ++ ptr; 是不正确的 - 你只是跑出了数组的末尾

标签: c++


【解决方案1】:

指针支持正常的算术运算,因此如果您知道所涉及的k 的值,您只需减去该值即可返回数组的开头。

如果您不知道 k 的值,那么如果您知道表示数组开头的唯一值,您也许可以通过。

如果你不知道其中任何一个,那你就很不走运了。 C++ 没有提供一种方法来查找数组的开头,只给定一个指向该数组内任意点的指针。

顺便说一句,请注意您使用while (ptr) 提供的代码也不能真正用于遍历数组的末尾。它试图继续前进,直到增加该点给出一个空指针,这可能永远不会发生——即使它确实发生了,指针也很有可能首先超过数组的末尾。

鉴于您描述的情况,我会考虑(如果可能的话)传递数组本身而不是指针:

template <class T, size_t N>
void subRoutine(T (&array)[N]) { 
    for (int i=0; i<N; i++)
        process(array[i]);
}

您可以这样调用:subRoutine(arr); 编译器将为您推导出arr 的大小,因此您无需传递额外的参数来指定大小。

【讨论】:

  • 那么在这种情况下,遍历到数组末尾的最佳方法是什么,这不是唯一的方法吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-25
  • 2013-04-19
  • 2023-03-11
  • 2010-10-25
相关资源
最近更新 更多