指针数组作为参数的问题
指针数组的大小为3,可是传到函数之后大小却总是为1,这是为什么呢?
我确认过,传送之后arr里的数据与地址(&arr[0]等)和p是一样的,所以数据传送没有问题。
环境是VS C++ 2010。
void iniArray(int *arr[])
{
int row=sizeof(arr)/sizeof(arr[0]); ←row总是为1
。。。
}
int _tmain(int argc, _TCHAR* argv[])
{
int temp[3][2]={{1,2},{3,4},{5,6}};
int *p[3]={temp[0],temp[1],temp[2]};
int size=sizeof(p)/sizeof(p[0]); ← size为3
iniArray(p);
。。。
}
[解决办法]
作为实参的数组会退化成指针
[解决办法]
指针数组是指的数组里面存放的是指针,与一般数组的唯一区别就在是这。数组作为函数参数,传递的是指针,指向该数组的指针而已。void iniArray(int *arr[])
{
int row=sizeof(arr)/sizeof(arr[0]); ←row总是为1
。。。
}
实质是:一个指针大小除以另一个指针大小 所以总是为1。
[解决办法]
请参考下面的代码及其其中的注释。
- C/C++ code
#include <iostream>using namespace std;void iniArray(int *arr[]){ cout << typeid(arr).name() << endl; // arr已经退化成int**,即一个二级指针 int row = sizeof(arr)/sizeof(arr[0]); cout << row << endl;}void initArray(int* arr[], int length){ cout << length << endl;}int main(void){ int a = 1; int b = 2; int c = 3; int* arr[] = {&a, &b, &c}; cout << sizeof(arr) / sizeof(arr[0]) << endl; // 会输出3 iniArray(arr); // 会输出1,因为arr作为参数传入时,已经退化成了int** // 因为这样的原因,所以在用数组作为函数的参数时,通常还会再多加一个参数, initArray(arr, sizeof(arr) / sizeof(arr[0])); // 用来说明数组的长度,就像initArray这样。 return 0;}