1、使用函数进行初始化
首先要给大家介绍一个初始化函数:
void *memset(void *s, int ch, size_t n)
将s中前n个字节 (typedef unsigned int size_t)用 ch 替换并返回 s 。在使用之前,C中引入string.h,而C++中引入cstring
const int N=10000; int f[N]; memset(f,255,sizeof(f));// 将f的前1000*4个字节初始化为255,二进制为1111-1111。表示的值为-1,连续取4个字节的值时同样为-1. printf("%d\n",sizeof(f));//40000个字节,说明每个整数占用4个字节.将每个字节初始化为255 printf("%d %d",f[0],f[1]);// 打印结果全部为-1
使用函数memset()进行初始化时,有很多人犯如下错误:
int p[100]; memset(p,100,sizeof(p));想使用如上代码将数数组初始化为100,这是不可能的。它只是将每个字节表示为100,而后连续取出4个字节,这个数就非常大了。
(2)初始化bool类型数组
bool b[100]; memset(b,0,sizeof(b));//就是初始化为false
(3)二维数组的初始化
char data[10][10]; memset(data, '#', sizeof(data));
将所有的字符初始化为'#'
(4)结构体初始化
struct node{ int x,y; int p[5]; }nn[100]; int main(){ printf("%d\n",sizeof(nn));//2800 memset(nn,0,sizeof(nn)); printf("x=%d,y=%d,p[0]=%d",nn[0].x,nn[0].y,nn[0].p[0]);//0 return 0; }
2、指定初始值
char str[10] = {0}; if(str[0]==NULL) printf("Yes\n"); if(str[0]=='\0') printf("Yes\n"); printf("%d",str[0]);
输出结果为:Yes Yes 0。所以这里10个元素会被赋值为 null 字符(空字符),这个就是指'\0'。直接打印str[0]的值会发现,显示的就是空字符,啥也没有,但强制转换后你会发现它的ASCII码值为0,它占一个字节,其中8位全为0。
再来看一个例子:
int main() { char str1[10] = {0}; char str2[] = {'\0', '\0', '\0'}; int len1 = strlen(str1);//0 int len = strlen(str2);//0 char a = '\0'; printf("len=%d;len1=%d,a=%c\n",len,len1,a);输出为0,0,空 return 0; }char a = '\0'; //赋值为休止符,打印出来空,什么都没有,但会占一个字符的位置,而且它不是空格,因为ASCII值为0,不是32。char str[] = {'\0', '\0', '\0'}; //定义数组,三个元素都是休止符,sizeof结果为3,但strlen的结果是0。char str1[10] = {0}; //这样的赋值实际上就是赋10个空字符,就是'\0', ASCII码为0
在操作字符数组时对以下几种情况进行区分:
char str[100];// 声明不指定初始值,这时候里面的为随机数 str[0]=='0' // 数组的第一个数为0字符 str[i]==0 // 字符串结束 str[i]==' ' // 空格
弄清如上的问题后接着往下看:
char str[10]; strcpy(str,0123456789);//由于字符串的末尾还有一个'\0'字符,因此它的实际长度应该为11
如上的代码将出现错误,这也是人们常犯的一个错误。
int main() { int a[]={0}; int b[10]={1,2,3}; printf("%d\n",b[8]);//结果为0 printf("a的数组长度为:%d\n",sizeof(a)/4); //结果为1 printf("%d\n",b[8]);//结果为0 return 0; }
1 指定的初始化数值不能比数组的元素多,但可以少
2 如果少,则列表中的初值被分配给从第一个元素开始的连续元素,那些没有的到初值的元素被初始化为0---明确地说是ASCII值为0
3 如果根本没有提供初始化列表,则情况不是这样的,数组将包含的是无用的数据,即内存中本来的值