指针在函数中的应用

    xiaoxiao2021-04-17  40

    指针在函数中的应用:

    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;而第二次,声明一个新的变量,改变这部分内存中的值时,输出的是一个不确定的值,这种错误具有很大的隐蔽性。故牢记下面的原则

    指针函数可以返回全新申请的内存地址;可以返回全局变量的地址;可以返回静态变量的地址;但就是不可以返回局部变量的地址

    转载请注明原文地址: https://ju.6miu.com/read-674296.html

    最新回复(0)