一、字符数组初始化
首先,无论是静态,局部还是全局数组只有在定义时才能初始化,否则必须通过其它方法,比如循环操作实现。
错误做法:
int a[3];
a[3] = {1, 2, 3};
没有在定义时初始化都是错误的!!!
其次,省略数组大小只能在有初始化的数组定义中。在定义数组的场合,无论如何,编译器必须知道数组的大小。
编译错误:
int a[];//error:没有确定数组大小
改正方法:
int a[]="hello";
最后,对于动态数组,不能被初始化,因为动态数组在定义时只是个指针,比如
int *a;
这里变量a只是个指向int类型的指针,而不是数组。动态分配有10个int类型元素的数组,如下:
a = (int) malloc(10*sizeof(int));此时a才成为数组;
很明显,指针a在定义的时候不能被初始化,比如这样写就是错误的:
int *a = {1,2,3,4,5,6,7,8,9,10}; /* 错误! */
因为a是只有4个字节的指针,没有可用的存储空间给需要初始化的变量。
法一:直接字符串赋值
char a[10]="hello";
或char a[10]={"hello"};
这种方法初始化时,系统会自动在数组没有填值的位置用'/0'补上。
法二:对字符逐个赋值
char a[10]={'h','e','l','l','o'};
这里要注意最后是存在'\0'的,数组空间要比字符个数多,数组实际分配的空间大小是字符串中字符个数加上末尾的'/0'结束符。
法三:strcpy函数(<string.h>或<cstring>)
char *strcpy(char* dest, const char *src);
char a[10]; strcpy(a, "hello");
strcpy函数将以'\0'结束的字符串复制到另一个地址空间里,当赋到'\0',循环结束。
法四:menset函数(<string.h>或<cstring>)
memset(void *s,int ch,size_t n);其中,ch的值以 int 形式传递,但是函数在填充内存块时是使用该值的无符号字符形式。
char a[10];
memset(a,0,10);或memset(a,'1',10);
memset()的深刻内涵:用来对一段内存空间全部设置为某个字符,一般用在对定义的字符串进行初始化,例如:memset(a,'\0',sizeof(a));
注:
char a[10]={0}与char a[10]={'\0'}等价,都是使数组a为空,即null。
char a[10]={'0'},则将第一个字符赋为0(具体原理以后补充)。