我在函数方面遇到数组指针(c++)的问题
I have a problem with array pointers (c++) in therms of functions
我是指针的新手,想学习它们。
出于学习原因,我创建了一个脚本,该脚本应该采用 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
还有输出,我们可以看到地址变化不同:
希望有人能给我一个解决方案
这是处理数组大小的方法:
#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);
}
我是指针的新手,想学习它们。
出于学习原因,我创建了一个脚本,该脚本应该采用 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
还有输出,我们可以看到地址变化不同:
希望有人能给我一个解决方案
这是处理数组大小的方法:
#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);
}