数组空间的初始化就是为每一个标签地址赋值。按照标签逐一处理。如果我们需要为每一个内存赋值,假如有一个int a[100];我们就需要用下标为100个int类型的空间赋值。这样的工作量是非常大的,我们就想到了让编译器做一些初始化操作,初始化操作是第一次赋值,第二次赋值就不能再这样赋值了。
int a[10]=空间;
我需要给它一个空间,让它对这里面的值进行批量处理;比如int a[10]={10,20,30}; //a[1]=10,a[2]=20,a[3]=30,a[4]=…=a[9]=0所以实际上还是批量内存拷贝的结果,未赋值的结果就是0。初始化与我们逐一赋值的效率是一样的。批量拷贝仅限于第一次赋值。
注意:数组空间的初始化和变量的初始化本质不同,尤其在嵌入式的裸机开发中,空间的初始化往往需要库函数的辅助。
char buf[10]={‘a’,’b’,’c’}; //c的字符串有一个重要的属性,字符串结尾有一个字符’\0’代表字符串的结束。因为我们这里为字符串空间定义了10个字符的大小,但是有时候我们并没有使用完这10个字节,打印的时候10个字节的打印也是错误的,所以为了给字符串一个结束的标志,让其它的函数比如printf函数输出的时候知道它的结尾。
char buf[]=”abc”; //省略数组大小,C会为数组指定大小,这里就是三个字符加上一个结尾标志,数组大小就是4
char buf[10]={“abc”};
char buf[10]=“abc”; //将三个字符批量拷贝到它分配的空间,末尾加’\0’
char *p=“abc”; //先给三个字符分配空间,再将指针指向字符串的首地址,这指向的是一个常量字符串。
buf[2]=’e’; //这是可以的
p[2]= ’e’; //这是不可以的,p指向的是常量区
测试代码如下
我们将这个字符串作为printf函数的参数,它返回的实际上是常量字符串的首地址,而我们这里将它作为一个整型来打印,有一个警告,应该把它作为无符号整型(内存地址是正整型的)来打印。
运行结果如下
可以看到的确打印了一个地址,说明双引号返回的的确是一个地址,正好和我们前面介绍的字符数组获取到它的首地址,然后依次拷贝,但是字符指针就直接得到它的地址存储。这些不同的操作就是数据类型具体的操作了。