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
- c——初始化 赋值
- c语言变量赋值,初始化
- C++基本概念——赋值&&初始化
- C语言指针的初始化和赋值
- C语言指针的初始化和赋值
- C语言指针的初始化和赋值
- C语言指针的初始化和赋值
- C语言指针的初始化和赋值
- C++初始化与赋值
- C++初始化与赋值
- C语言指针的初始化和赋值
- C指针的初始化与赋值
- C++初始化与赋值
- C++初始化与赋值
- c语言指针的初始化赋值
- C、C++数组初始化,数组赋值
- C语言指针的初始化和赋值
- C++初始化与赋值
- Linux下部署多个Tomcat
- springboot mvc 处理异常
- python在Eclipse中集成pydev,以及window安装settools、requests
- #“Machine Learning”(Andrew Ng)#Week 2_1:Multivariate Linear Regression
- 【Java】代理模式
- c——初始化 赋值
- Python计算10000以下的Lychrel数个数
- 今天碰到的几个python 小问题
- 亚马逊AWS“后付费”与阿里云“先付费”消费哲学的区别
- 第十一节 Trait进阶
- ffmget编译
- 第一个Spring Boot应用
- 平时程序中遇到的crash(一)
- Ubuntu 安装 SQL Server