指针作为函数参数传递的注意事项

Posted kongyijin

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了指针作为函数参数传递的注意事项相关的知识,希望对你有一定的参考价值。

指针作为函数参数传递
  指针作为参数设计说明:

  • 传递输入内存,需要提供内存大小(数组到指针无法知道大小), 并设置为const
  • 传递输出内存,同样需要提供内存大小,防止溢出
  • 如果指向函数中创建堆内存,需要传递指针引用或者指向指针的指针
  • 通过返回值只能返回堆中空间,比较危险,需要函数中注释说明,防止内存泄露

  作为参数输入:

//普通指针传递
void PtrFunction(const char* data, int size)  

    cout << "sizeof(data) = " << sizeof(data) << endl;

void PtrFunction2(const char* data, int size)

    cout << "strlen(data) = " << strlen(data) << endl;
    cout << "size = " << size << endl;

//经过参数传递 数组会转成指针
void PtrFunction(const char data[])

    cout << "sizeof(data) = " << sizeof(data) << endl;
    cout << "strlen(data) = " << strlen(data) << endl;

//传递参数 获取数组大小
template<class Ty, size_t Size>
void TestMemArr(Ty(&data)[Size])

    cout << "sizeof(data) = " << sizeof(data) << endl;

////////////////////////////输入测试//////////////////////////////
PtrFunction(data,sizeof(data)); //指针传入后需要一并传入大小,因为进入函数后无法获得大小
PtrFunction(data);          //改成数组,也无法获取实际大小
TestMemArr(data); //可以用模板
const char* str = "Hello";
PtrFunction2(data, 13);    //或者strlen,只不过strlen获取实际长度,而sizeof获取数组长度(\'\\0\')

 

 

  作为参数输出:

//函数内创建内存
char* TestMem()

    char buf[1024] = "test";
    return buf;
    //不能返回栈中空间,因为栈中数据出了函数就会被释放

void TestMem(char* out)

    //函数内创建内存,但是这个更改只在函数内部有效,不会影响到函数外部的指针, 内存泄露!!!
    //因此,函数外部的out指针仍然是未初始化的,并且不会得到函数内部分配的内存。
    out = new char[1024];

int TestMem(char** out)

    //指针的指针**允许你在函数内部修改函数外部的指针的值。
    int size = 1024;
    *out = new char[size];
    return size;

////////////////////////////////输出测试///////////////////////////////////
char* out = nullptr;
TestMem(out);
cout << "out " << (int)out << endl;            //直接输出out的话,不会有任何显示,因为out此时没有指向任何一片内存空间
TestMem(&out);
cout << "&out " << &out << endl;
delete out;
out = nullptr;

 

二维数组指针作为函数参数传递

以前二维数组作为函数参数传递我都是这么写的void def(int a[][10])。传递一个二维数组a,(其中第二维要确定大小)其实想一想挺合理的...

后来,发现还有这种写法 void def(int(*a)[10]);

/* ***********************************************
Author        :guanjun
Created Time  :2017/3/18 13:32:52
File Name     :33.cpp
************************************************ */
#include <bits/stdc++.h>
#include <windows.h>
using namespace std;
void dfs(int (*a)[10]){
    for(int i=0;i<5;i++){
        for(int j=0;j<10;j++){
            cout<<a[i][j]<<" ";
        }
    }
}
void dfs2(int a[][10]){
    for(int i=0;i<5;i++){
        for(int j=0;j<10;j++){
            cout<<a[i][j]<<" ";
        }
    }
}
int main(){

    int (*a)[10]=new int[5][10];
    for(int i=0;i<5;i++){
        for(int j=0;j<10;j++){
            a[i][j]=i*j;
        }
    }
    dfs(a);
    dfs2(a);
    delete []a;
    return 0;
}

其实,还有这种次而发 void def(int **a) 

我提的弱智问题...http://stackoverflow.com/questions/43018146/what-is-the-difference-between-the-two-wording-when-the-two-dimensional-array-is/43018294?noredirect=1#comment73125242_43018294

以上是关于指针作为函数参数传递的注意事项的主要内容,如果未能解决你的问题,请参考以下文章

cpp 线程传递参数

如何在C中将函数指针数组的函数指针作为函数参数传递?

二维数组指针作为函数参数传递

C++ CreateThread函数如何传递this指针作为参数

结构体作为函数参数值传递的问题

无法使用双指针作为函数参数传递二维数组[重复]