c——初始化 赋值

来源:互联网 发布:网络安全法与等级保护 编辑:程序博客网 时间:2024/05/18 22:17

概述

  • 初始化和赋值是完全不同的概念,对于某些复合类型对象,可整体初始化,但不可整体赋值
  • 初始化必然伴随对象定义,对象定义必然伴随内存空间分配,初始化之前,对象无值(无值不等于值为0),初始化只是赋予对象一个初始值,并不是改变对象值,因此初始化只能一次
  • 赋值是改变对象值,不管赋的值跟当前值是否一致(编译器不判断,编译期也无法判断),赋值时编译器认为对象已完成了初始化,有了初值(不管之前有无初始化,编译器都认为已初始化,如果之前没有初始化,那是开发者的问题),因此赋值可多次
//定义未初始化int i1;    //定义并初始化int i2 = 5;    //先定义再赋值int i3;i3 = 8;

各类型对象初始化&赋值

对于c的各种类型,有些类型可初始化和赋值,有些类型可初始化但不可赋值,有些类型必须初始化但不可赋值
以下类型可初始化和赋值:
  • 内置类型
  • enum类型
  • 指针类型
enum EColor{    ERed,    EGreen,    EBlue,};void init_assign(){    int i = 5;    i = 8;        enum EColor color = ERed;    color = EBlue;        int* pi = NULL;    pi = &i;}
以下类型可初始化但不可赋值:
  • 数组类型
  • struct类型
  • union类型
struct SAnimal{    short age;    long color;};union UAnimal{    short age;    long color;};void init_assign(){    struct SAnimal animal1 = {5, 8};    //animal1 = {15, 18};    animal1.age = 15;    animal1.color = 18;        union UAnimal animal2 = {5};    //animal2 = {8};    animal2.age = 8;        int foods[3] = {5, 8, 9};    //foods = {15, 18, 19};    foods[0] = 15;    foods[1] = 18;    foods[2] = 19;}
以下类型必须初始化但不可赋值:
  • 函数类型
void feed1(int rice, int meat){    printf("feed rice and meat\n");}void feed2(int fruit, int fish){    printf("feed fruit and fish\n");}void init_assign(){    //feed1 = feed2;}

默认初始化

  • 只有位于全局数据区的对象会默认初始化,包括全局对象,static全局对象,static局部对象,默认初始化为0,栈(stack)和堆(heap)对象不会默认初始化,需显式初始化
  • 默认初始化为0对不同类型对象有不同含义,整型为0,浮点型为0.0,指针型为NULL,数组类型所有数组元素为0,struct(union)类型所有成员为0等,即对象内存空间所有bit置0,可理解为调用memset(&obj, 0, sizeof(obj))
int g_food;static int g_static_food;void default_init(){    static int l_static_food;    int food;        printf("g_food = %d\n", g_food);    printf("g_static_food = %d\n", g_static_food);    printf("l_static_food = %d\n", l_static_food);    printf("food = %d\n", food);}
output:
g_food = 0g_static_food = 0l_static_food = 0food = 73832
0 0
原创粉丝点击