一、数组的定义
数组是指针变量的特殊形式,是内存分配的一种形式。
数组定义了一个空间,既然是空间就要想到两个问题:
1、大小
2、读取方式
定义方式:数据类型 数组名[m] m的作用域是在申请的时候,数组名只是一个常量,一个标签。,一定不要放到=的左边。
eg:int a[100]; 定义了100个int空间
读取方式:a[n] n可以是任何数字,与m无关、
二、数组空间的初始化
按照标签逐一处理
int a[10]: 合法操作空间:[0-9]
a[0] = xx;
a[1] = yy;
程序员这样赋值,工作量比较大,能不能让编译器进行一些自动处理,帮助程序员写如上的程序。
——》空间定义时,就告知编译器的初始化情况,空间的第一次赋值,初始化操作。
可不可以直接int a[10] = 空间呢?
C语言本身,CPU内部本身一般不支持空间和空间的拷贝
int a[10] ={10,20,30};=====>a[0] = 10;a[1] =20;a[2] =30;a[0]=0;
这两条代码的效率是一样的,不过是为了程序员少打几个字。
{}代表空间的限制块。
数组空间的初始化,和变量的初始化本质是不同的,尤其在嵌入式裸板开发中,空间的初始化一般要借助一些库函数或者手动编写的程序。
char
char buf[10] = {'a','b','c'};(''定义的内存空间大小是8bit和char对应)
buf当成普通内存来看,没有问题
buf看成一个字符串来看,最后加上一个‘0’
字符串的重要属性,结尾一定有个‘\0’
char buf[10] = {"abc"};//结尾的0隐藏
char buf[10] = "abc"; 编译器将常量abc逐一拷贝到buf中,生成变量abc,buf可变
char *p = “abc”; p指向了字符串abc的地址,p不可变
char buf[] = “abc”;//4位
buf = “hello world”;//修改标签名是错误的
想要第二次内存初始化,赋值怎么办?
只能逐一处理
buf[0] = ‘h’.......buf[n+1] = 0;
这样处理显然太麻烦了,所以我们引入两个函数 strcpy,strncpy
一块空间,当成字符空间,提供一套字符拷贝函数
字符拷贝函数的原则:
内存空间和内存空间的逐一赋值的功能的一个封装体
一旦空间中出现0这个特殊值,函数就即将结束。
strcpy()是C语言中的一个字符串操作函数,用于复制字符串。 prototpye:
char *strcpy(char *dest, const char *src);
strcpy()的作用是将字符串src所指向的字符串复制到dest所指向的空间。该函数的主要特征包括:- 需要目标空间dest足够大,能容纳源字符串。
- src和dest所指向的内存区域不可以重叠。
- 复制时从src开头开始,遇到'\0'结束。
- 返回指向dest的指针。示例:
char src[]= "hello"; char dest[10]; strcpy(dest, src); // dest现在包含"hello"
strcpy()是一个非常基本的字符串操作函数,用法简单但需要注意内存问题。更安全的字符串复制可以使用strncpy(),指定最大复制字符数。
非字符串空间
数据采集 0x00 0xff 8bit
开辟一个储存这些数据盒子
char buf[10];--->string
unsigned char buf [10];---->data