多重指针--函数外申请动态内存

一、申请动态内存函数 int apply_memory(const char **pcDesAddr, const int len):

/*************************************************
  Function:    	int apply_memory(const char **pcDesAddr, const int len)
  Description:	申请动态内存
  Input:        len:申请内存大小
  Output:      	**pcDesAddr:动态内存地址
  Return:		-1:失败
                0:成功
*************************************************/
int apply_memory(const char **pcDesAddr, const unsigned int len)
{
	if (!(*pcDesAddr = (char *)malloc(len)))
	{
		printf("Apply [%d] memory FAIL!\n");
		return -1;
	}
	return 0;
}

输入:

1、const unsigned int len:函数需要申请动态内存大小;

输出:

1、const char **pcDesAddr:动态内存首地址;

    char** 是一个指向char*的指针。在函数中如果要对一个参数char *申请空间,同时要在函数外面使用。需要传递char**,否则申请的空间无法在函数外面使用,但申请的空间仍会在,造成空间泄露。

### 关于Arduino中的数组指针 #### 数组与指针的关系 在C++编程环境中,包括Arduino平台,数组名本质上是一个指向该数组首元素的常量指针。这意味着可以通过指针对数组进行操作。 ```cpp int array[] = {1, 2, 3}; int *ptrToArray = array; // 或者更常见的形式是: int *ptrToArray = &array[0]; ``` 上述代码定义了一个整型数组`array`以及一个指向这个数组第一个元素的指针变量`ptrToArray`[^1]。 #### 动态分配内存创建数组 当不确定所需数组大小时,在程序运行期间动态地为其分配空间是非常有用的技巧: ```cpp void setup(){ int length = 5; // 假设长度为5 int* dynamicArray = new int[length]; // 创建一个新的动态数组 for(int i=0;i<length;++i){ dynamicArray[i]=i*i; // 初始化一些值给新创建的数组 } delete [] dynamicArray; // 记得释放不再使用的堆上分配的空间 } ``` 这段代码展示了如何利用new运算符来申请一块连续存储区域用于保存指定数量的相同类型的对象,并通过delete语句回收这部分资源以防止内存泄漏。 #### 函数参数传递方式——传地址而非复制整个数组 为了提高效率并减少不必要的拷贝开销,通常建议采用指针作为形参接受来自实参所代表的实际数据结构的位置信息而不是直接传送其副本: ```cpp void printArray(const int* arr,int size){ for(int i=0;i<size;++i){ Serial.print(arr[i]); Serial.print(' '); } } void loop(){ static const unsigned short SIZE = 7u; float myFloats[SIZE]={1.2f,2.4f,3.6f,4.8f,6.0f,7.2f,8.4f}; printArray((const int*)myFloats,(int)SIZE); } ``` 这里需要注意的是由于类型转换的原因,虽然实际上传递给printArray函数的是float类型的数值序列,但在内部处理过程中被视作整形对待;因此应当谨慎选择合适的转换方法以免造成精度损失或其他潜在风险。 #### 多维数组及其对应的多级指针表示法 对于二维甚至更高维度的情况,则需引入多重间接寻址的概念即所谓的“指针指针”。例如声明如下所示的一个简单的字符矩阵: ```cpp char matrix[][strlen("hello")+1]={ "hello", "world" }; char (*p)[strlen("hello")+1]=matrix; for(unsigned char row=0;row<(sizeof(matrix)/sizeof(*matrix));++row){ Serial.println(p[row]); } ``` 此段代码实现了对字符串表项逐行输出的功能,其中`p`是指向每行列起始位置处的指针数组成员之一。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值