内存分配的一种形式

数组的定义及初始化

定义

定义空间:

  1. 大小
  2. 读取方式
  • 数组名是常量,不能放等号左边 数据类型 数组名[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

结束标志,只能定义个数 拷贝三要素:

  1. src
  2. dest
  3. 个数
//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的 当作一个立体的话,指针指的相当于一溜,要选出一溜