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