//函数形参中的a需要作为函数执行结果传出函数
void test(int* a)
{
int* b = new int(2);
//这里只能使用*a = *b而不能用a = b,否则函数对指针a的操作不能传出函数
*a = *b;
}
//函数返回值作为函数执行结果传出函数
int* test()
{
int* b = new int(2);
return b;
}
int main()
{
int* a = NULL;
a = test();
cout << *a << endl;
int* a = new int();
test(a);
cout << *a << endl;
}
总结:在向函数传入指针时,若想要这个指针的地址上的内容作为函数执行结果传出函数,函数内赋值一定要用 *a = *b 的方式,因为函数内部的指针本身和传入函数的指针是不一样的,只是这两个指针的值相同,都指向同一内存区域,如果使用 a = b ,只是在对函数作用域内的这个指针的值进行修改,函数结束后这个指针的值就被释放,并不能传出函数。只有使用解引用直接操作指针指向的地址才能将执行结果传出函数
如
void test(int *p) //函数内会新构造一个int *p的指针,其值等于传入函数的实参*p
{ //对p指针本身的任何操作都只是在操作这个新构造的指针
int *a = new int(10);
*p = *a; //正确,函数执行后*p的值改为10
p = a; //错误,函数执行后*p的值仍不变
}
同时如果函数形参时指针,调用的实参传入数组名,在函数内部对数组名指针进行加减也是正确的,在函数中使用 *数组名 可以对具体元素进行修改,并且结果可以传出函数
如:
//定义时:
void test(int *p)
{
p++;
*p = *p + 1;
}
//调用时:
int a[] = {1,2,3};
test(a);
//执行结果是a[1]变成了3
若函数形参是指针,传入函数中的形参是对象数组名,在函数中通过 对象数组名[i].属性 进行的修改可以传出函数
如
void test(ClassName *p)
{
p[1].age = 10; //可以传出函数
}