关于C、C++初始化

1、使用函数进行初始化

首先要给大家介绍一个初始化函数:

void *memset(void *s, int ch, size_t n)

将s中前n个字节 (typedef unsigned int size_t)用 ch 替换并返回 s 。在使用之前,C中引入string.h,而C++中引入cstring

(1)初始化整数数组
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 如果根本没有提供初始化列表,则情况不是这样的,数组将包含的是无用的数据,即内存中本来的值



你可能感兴趣的:(关于C、C++初始化)