【问题标题】:I have a problem with array pointers (c++) in therms of functions [duplicate]我在函数方面遇到了数组指针(c++)的问题[重复]
【发布时间】:2021-11-29 17:12:28
【问题描述】:

我是指针新手,想学习它们。

出于学习原因,我创建了一个脚本,该脚本应采用 Python 的 len() 函数来获取数组的大小。于是我写了如下代码:

int len(int *arrPtr){
    int arrSize = *(&arrPtr + 1) - arrPtr;
    return arrSize;
}

int main(){
    int arr[] = {1,2,3,4,5};
    int lenArr = len(arr);

    cout << "lenght of array: " << lenArr;
}

当我执行代码时,我得到一个随机数:

我试图找到解决方案,但失败了。我发现通过将数组的指针索引地址增加 1,我得到一个不同的地址,无论是在函数内部还是函数外部。在main() 函数中,同样的代码可以工作。

#include <iostream>
using namespace std;

int len(int *arrPtr){
    cout << "inside func: " << arrPtr << endl;
    cout << "inside func: " << &arrPtr + 1 << '\n' << endl;
    int arrSize = *(&arrPtr + 1) - arrPtr;
    return arrSize;
}

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

    cout << "outside func: " << arr << endl;
    cout <<  "outside func: " << &arr + 1 << '\n' << endl;

    int lenArr = len(arr);
    cout << "lenght of array: " << lenArr;
}

这里是更改地址输出的代码:

terminal output:
outside func: 0x1f961ffb90
outside func: 0x1f961ffba4

inside func: 0x1f961ffb90
inside func: 0x1f961ffb78

lenght of array: 444072222

还有输出,我们可以看到地址变化不同:

希望有人能给我一个解决方案。

【问题讨论】:

  • 仅使用指向其元素之一的指针无法获取数组的大小
  • 你无法像这样确定数组的大小。当您将数组作为指针传递时,所有大小信息都会丢失。
  • 好的,我明白了,感谢您的快速帮助!!!

标签: c++ arrays function pointers arraylist


【解决方案1】:

这是处理数组大小的方法:

#include <array>
#include <iostream>
//using namespace std; // don't do this.

template<std::size_t N>
void function(const int(&arr)[N])
{
    std::cout << "std::array from function, len = " << N << "\n";
    std::cout << "arr[2] = " << arr[2] << "\n";
}

void function2(const std::array<int, 5>& arr)
{
    std::cout << "std::array from function2, len = " << arr.size() << "\n";
    std::cout << "arr[2] = " << arr[2] << "\n";
}

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

    auto len1 = sizeof(arr) / sizeof(int); // do it where the size of the array is still known.
    std::cout << "len 1 =  " << len1 << "\n";
    function(arr);

    // or use std::array which behaves more like any other class
    // and which always knows its size

    std::array<int, 5> arr2{ 1,2,3,4,5 };
    std::cout << "std::array len = " << arr2.size() << "\n";

    function2(arr2);
}

【讨论】:

  • 你打败了我 :-)。考虑使用sizeof(arr[0])sizeof(*arr) 而不是sizeof(int);这使得代码更加灵活和通用。
  • @Walter 我同意你的说法,虽然我很久以前就停止使用这种数组大小计算,并且只使用其他技术(以及基于范围的 for 循环)我可以。跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-07
  • 1970-01-01
  • 2013-03-11
  • 1970-01-01
  • 2017-12-03
相关资源
最近更新 更多