实用指南:嵌入式第八天学习

第八天学习

课内知识

数组概念

由相同数据类型的多个元素所组成的一种复合类型数据。

示例:

int a[5];

语法释义:

    • a 是数组名,即这片连续内存的名称
    • [5] 代表这片连续内存总共分成5个相等的格子,每个格子称为数组的元素
    • int 代表每个元素的类型,可以是任意基本类型,也可以是组合类型,甚至可以是数组
  • 初始化:在定义的时候赋值,称为初始化

img

数组格式

元素的数据类型  数组的名字[元素的个数]

比如:int array[5];//定义一个数组array,该数组一共有五个元素,每个元素都是int类型

#include<stdio.h>
  int main(void)
  {
  //分开定义
  int a,b,c,d,e;
  //使用数组定义
  int array[5];
  return 0;
  }

数组特点

  • 数组中所有的元素数据类型都是一致的
  • 数组申请的内存是连续的。从低地址到高地址依次连续存放数组中的每个元素。

数组元素的引用

  • 存储模式:一片连续的内存,按数据类型分割成若干相同大小的格子
  • 元素下标:数组开头位置的偏移量,a[0]引用第1个格子,a[1]引用第2个格子,以此类推

img

int a[5]; // 有效的下标范围是 0 ~ 4
a[0] = 1;
a[1] = 66;
a[2] = 21;
a[3] = 4;
a[4] = 934;
a[5] = 62; // 错误,越界了
a  = 10; // 错误,不可对数组名赋值 

数组的赋值

定义的时候初始化

int array[5] = {1,2,3,4,5};
int array[] = {1,2,3,4,5};---->语法正确,如果对全部数组元素赋初值,那可以不指定数组长度
  • 赋值的时候,成员之间使用逗号隔开;赋值的成员的数据类型要与数组定义的数据类型一致
  • 初始化列表的时候,初始化的数据 个数小于或者等于长度
int array[5] = {1,2,3};---->语法正确
array[0] = 1;
array[1] = 2;
array[2] = 3;
array[3] = 0;
array[4] = 0;

如果是定义的时候初始化,但是初始化列表个数小于数组的大小,那么无论这个数组是全局变量还是局部变量,没有赋值的成员都是为0

int  array[3] = {100,200,300,400};//错误,越界访问没有申请到的空间	

先定义,没有初始化 —》全局变量为0,局部变量为随机值

int  array[3];//局部变量 所有元素是随机值,全局变量所有元素的值为0

清空数组

int array[5] = {0}; //表示给array数组中第0个元素赋值为0,后面所有元素都会默认为0

测量数组大小和元素个数

测量数组的总大小: sizeof(array)
测量数组的元素的个数:sizeof(array)/sizeof(array[0])

img

变长数组

  • 概念:定义时,使用变量作为元素个数的数组。
  • 要点:变长数组仅仅指元素个数在定义时是变量,而绝非指数组的长度可长可短。实际上,不管是普通数组还是所谓的变长数组,数组一旦定义完毕,其长度则不可改变。
  • 示例:
int len = 5;
int a[len];  // 数组元素个数 len 是变量,因此数组 a 是变长数组
int x = 2;
int y = 3;
int b[x][y]; // 数组元素个数 x、y 是变量,因此数组 b 是变长数组
int b[2][y]; // 数组元素个数 y 是变量,因此数组 b 是变长数组
int b[x][3]; // 数组元素个数 x 是变量,因此数组 b 是变长数组
  • 语法:变长数组不可初始化,即以下代码是错误的:
int len = 5;
int a[len] = {1,2,3,4,5}; // 数组 a 不可初始化

字符数组

char c1[]={'c','h','i','n','a'};
char c2[]={"china"};   相当于  char c2[] = "china"; 元素个数为6,默认会在后面加一个'\0'

两者有什么区别?

​ char c2[]={“china”};

​ <==>char c2[]={‘c’,‘h’,‘i’,‘n’,‘a’,‘\0’};

​ 字符串保存在内存中时会在末尾加一个终止符’\0’,'\0’的ASCII码就是0。

​ 终止符的作用是用来标志字符串的结束。

​ 我们在进行操作字符串时都是代入字符串的首地址,正因为每个字符串都有一个终止符,系统才知道字符串的具体范围。

​ 字符数组名是一个常量,其值为保存的字符串的首地址。

#include <stdio.h>
  int main(void)
  {
  char c1[]={'c','h','i','n','a'};
  char c2[]="hello";
  printf("c1:%s size:%lu\n",c1,sizeof(c1));
  return 0;
  }

打印结果:

gec@ubuntu:/mnt/hgfs/share$ ./a.out
c1:chinahello size:5

分析:printf 指定%s的格式 输出 字符串,而字符串默认是以\0结尾,所以 printf输出一个字符串的时候 要遇到\0才会停止输出,所以输出c1 的时候,直到遇到c2中的\0才停止输出。显然,结果不是我们想要的,所以在数组c1中,元素个数应该要多加一个,预留出\0的位置。

解决方法:

char c1[]={'c','h','i','n','a','\0'};
或者char c1[6]={'c','h','i','n','a'};
注意

如果字符数组在定义的时候没有赋值,只能通过元素单个赋值或者字符串操作函数进行赋值

char string[6];
string[0] = 'h';
string[1] = 'e';
strcpy(string,"hello");

特别注意:这种写法是错误的

char string[6];
string[6] = "hello";//错误
string = "hello";//也是错误的

原因:数组元素的访问只能是通过单个元素进行的,所以string[6]是错误的;数字的名字经过编译之后其实就是一个地址,也就是常量(比如可能是0x00ff110f),所以给一个地址赋值是错误的,string = “hello”;//也是错误的

img

posted on 2025-12-19 11:06  ljbguanli  阅读(1)  评论(0)    收藏  举报