关于C、C++初始化

来源:互联网 发布:淘宝上的杰克琼斯 编辑:程序博客网 时间:2024/06/05 17:32

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



原创粉丝点击