指针在函数中的应用:
1. 指针作为函数参数。
函数之间参数的传递要对数据进行拷贝,而利用指针作为函数参数传递数据的本质,就是在主调函数和被调函数中,通过指向同一内存地址的不同指针(函数传值时拷贝了一个指针)访问相同的内存区域,从而实现数据的传递和交换。如下:
# include <iostream>
using namespace std;
//指针在函数中的应用,这里是作为函数的参数
void getSum(int* arr, int len, int* sum) //arr指针:数组数据太大时,传指针更好; sum指针:便于修改并且传出值
{
*sum = 0;
for(int i=0; i<len; ++i)
*sum += *(arr+i);
return;
}
int main()
{
int arr[5] = {1, 2, 3, 4, 5};
int sum;
getSum(arr, 5, &sum);
cout<<sum<<endl;
return 0;
}
2. 指针作为函数的返回值(指针型函数)。
这里需要注意,不能把一个指向局部变量的指针作为返回值:因为函数内部声明的局部变量在函数结束后其生命周期已经结束,内存会被自动释放,这时它的内存地址无意义。如果将其作为函数返回值返回给主调函数,并在主调函数中访问这个指针所指向的数据,将产生不可预料的结果。如下:
# include <iostream>
using namespace std;
int* get()
{
int a = 1;
return &a; //返回指向局部变量的指针
}
int main()
{
int* loc = get();
cout<<"当前局部变量的值:"<<*loc<<endl;
int b = 2; //声明一个新的整形变量,改变内存内容再次输出时,得到的是一个不确定的数值
cout<<"改变内存后,当前局部变量的值是:"<<*loc<<endl;
return 0;
}
/*output:
当前局部变量的值:1
改变内存后,当前局部变量的值是:0 */
测试可见,第一次output 1时,虽然局部变量a已经不存在,但是存放它的内存中的值并没有改变,所以输出了1;而第二次,声明一个新的变量,改变这部分内存中的值时,输出的是一个不确定的值,这种错误具有很大的隐蔽性。故牢记下面的原则:
指针函数可以返回全新申请的内存地址;可以返回全局变量的地址;可以返回静态变量的地址;但就是不可以返回局部变量的地址