C语言 指针的使用
来源:互联网 发布:java socket 心跳机制 编辑:程序博客网 时间:2024/04/29 12:28
C语言 指针
当使用变量时出现长度不定,譬如在串口通信中,有些通信协议是不定长的,那么这个就应该使用指针;如果使用数组的话,会有下面这两个小问题,
- 要将数组的大小要定的比较大,已保证能够容纳最大的指令,这个相对于短小的指令来说就显得太浪费数组的资源了
- 有时候定义的数组很大,对系统的栈的内存会有不小的压力,因为在局部变量的使用都是在栈上
基于上面这两个问题,可以使用指针来优化,指针可以在申请时指定长度,不用像数组只要定义了大小就不可改变;此外,指针的分配是在堆内存的,这时需要注意就是不要让这个指针成为野指针,或者忘了释放导致内存泄露。
下面就以一个小例子来说明下,这个是在FreeRTOS下使用的函数,所以内存分配函数和释放函数与标准库不一样。
1. 定义:
BYTE * bybuf = NULL; //定义指针时赋值为NULL,避免该指针指到其他不可控的内存单元
2. 申请:
bybuf = (BYTE *)pvPortMalloc(Len);//分配内存,len:长度 //判断是否内存分配是否成功,若有NULL则内存分配失败 if(NULL == bybuf) { return eeror; }
2. 初始化
memset(bybuf, 0, Len);//将bybuf指向的内存单元初始化为0,并不是必须的,因为下面立刻又对该内存进行操作,会别重新赋值
3. 使用
对指针指向的内存单元进行赋值操作
*bybuf = 0x11; *(bybuf+1) = 0x10; *(bybuf+2) = (BYTE)(screen_id>>8); *(bybuf+3) = (BYTE)screen_id; *(bybuf+4) = (BYTE)(control_id>>8); *(bybuf+5) = (BYTE)control_id; memcpy(bybuf+6, str, Len);
4. 释放
//使用完毕后,要释放该指针,并重新赋值为NULL if(NULL != bybuf) { vPortFree(bybuf); bybuf = NULL; }
合起来的整个函数如下:
uint32_t SetTextValue(uint16_t screen_id, uint16_t control_id, uint8_t * str, uint16_t Len){ uint32_t error = SYS_ERROR; BYTE *bybuf = NULL; bybuf = (BYTE *)pvPortMalloc(Len+6); if(NULL == bybuf) { return error; } *bybuf = 0xb1; *(bybuf+1) = 0x10; *(bybuf+2) = (BYTE)(screen_id>>8); *(bybuf+3) = (BYTE)screen_id; *(bybuf+4) = (BYTE)(control_id>>8); *(bybuf+5) = (BYTE)control_id; memcpy(bybuf+6, str, Len); //使用bybuf if(NULL != bybuf) { vPortFree(bybuf); bybuf = NULL; } return error;}
0 0
- C语言 指针的使用
- C语言--指针的使用
- C语言指针的使用
- C语言 指针的使用
- c语言指针的指针使用
- C语言的指针的使用
- c语言指针使用
- c语言指针使用的注意问题
- c语言中指针的使用场合
- c语言中指针的使用场合
- c语言中指针的使用【一】
- C语言中数组指针的使用
- golang指针的使用,类似C语言
- C语言多级指针的使用
- C语言的void*指针使用
- C语言函数指针的使用举例
- C语言函数指针的使用
- C语言函数指针的使用
- 【PyCharm 教程】(七)管理解释器及第三方模块、包
- 微信小程序-使用audio组件播放音乐
- 单链表的基本操作(python)
- NTC热敏电阻
- javascript函数(1)
- C语言 指针的使用
- 中文分词的基本原理以及jieba分词的用法
- MySQL--数据表插入记录
- 安装win10的笔记本有10个地方需要微调
- 解决项目jar包 与tomcat 自带jar 冲突问题
- Caffe+Ubuntu 16.04 安装教程
- 工作中遇见的一些小tips(一)
- LeetCode刷题(Two Sum)
- 51nod-1603 限高二叉排列树