今天又遇到了那个指针作函数参数的经典问题。
今天室友小彪同学,模拟线性表,然后用了类似下面的代码:
void test(int *tp, int n);
void creatIt(int *tp, int n);
int main()
{
int *p = nullptr;
test(p, 5);
creatIt(p, 5);
}
void test(int *tp, int n)
{
tp = new int[n];
}
void creatIt(int *tp, int n)
{
for(int i=0;i<n;i++)
{
tp[i] = i;
}
}
然后报错了
原因就是,函数是通过拷贝实参的值给形参赋值,这里虽然是传递的指针,但是并不能改变指针的值。就像初学时的swap函数一样,只是在函数的内部进行了一些列与实参本身无关的事,最终 p 还是一个空值。
要么用二级指针来改变一级指针的值,要么就用指针引用来改变传递过来的实参的值。
如下:
void test(int **tp, int n);
void creatIt(int *tp, int n);
int main()
{
int *p = nullptr;
test(&p, 5);
creatIt(p, 5);
}
void test(int **tp, int n)
{
*tp = new int[n];
}
void creatIt(int *tp, int n)
{
for(int i=0;i<n;i++)
{
tp[i] = i;
}
}