内存分配的一种形式
数组的定义及初始化
定义
定义空间:
- 大小
- 读取方式
- 数组名是常量,不能放等号左边 数据类型 数组名[m];
- m的作用域只在申请的时候,就是说,申请的时候是要求了m的区域,但是后面使用还是能够越界访问
- m可以是负数
int a[100];
数组空间的初始化
字符空间
ASCII吗编码来解码的空间–给人看的 \0作为结束符 %s abc ‘a’ ‘b’ ‘c’
int
空间的赋值 按照标签逐一处理
int a[10]; // [0 - 9]
a[0] = 10;
a[1] = 20;
...
//效率上下等同
int a[10] = {10,20,30};
//默认补0
数组空间初始化 和 变量初始化 本质不同,尤其在嵌入式的裸机开发中,空间的初始化往往需要库函数的辅助
char
char buf[10] = {'a','b','c'};
//buf当作普通内存来看,没问题
//buf当作字符串看,最后加上'\0'
- 字符串重要属性,结尾一定有’\0’
char buf[10] = {"abc"};
buf[2] = 'b'; //OK
//系统把abc逐个拷入buf里,最后内存里有存着abc的buf和abc字符串
char *p = "abc";
p[2] = 'e'; // NO
//系统把p指针指向了存abc字符串的地方,内存只有一个abc
//strcpy函数
char buf[10] = {"abc"};
strcpy(buf,"Hello world");
//数组赋值
//strcpy看到0停止,容易内存泄漏,工程中不要使用,使用strncpy
strncpy()
非字符空间
数据采集 0x00 - 0xff 8bit 定义
char buf\[10\]; //string
unsigned char buf\[10\]; //data
结束标志,只能定义个数 拷贝三要素:
- src
- dest
- 个数
//memcpy()函数
int buf[10];
int sensor_buf[100];
memcpy(buf,sensor_buf,10*sizeof(int));
unsigned char buf[10];
unsigned char sensor_buf[100];
memcpy(buf,sensor_buf,10*sizeof(unsigned char));
指针与数组
int b[100]; //存的数
char* a[100] //里面存的地址
//sizeof(a) = 100*4
多维指针
char **a;//指向多个指针的指针
多维数组
多维数组和多重指针没关系,不要混
数组名的保存
指向 int a[10] int *p1 = a; OK的
指向 int b[5][6] int **p2 = b; NO的 int (*p2)[6] = b; OK的
指向int c[2][3][4]; int (*p)[2][3]; OK的 当作一个立体的话,指针指的相当于一溜,要选出一溜