c语言变量赋值,初始化

数组变量为全局变量,或被部分初始化,均会出现这种情况。

C语言中,变量在没有显式初始化时,区分变量类型,有如下几种情况:
1 全局变量, 和静态局部变量,未初始化时值默认为0.无论是数组还是变量,都是如此。
2 局部变量,初始值为随机值。

3 数组类局部变量,当被部分初始化时,未被初始化部分,值默认为0。

1.在C语言中,“初始化”和“赋值”是两个不同的概念。楼主问题中应该是“初始化”而非“赋值”
int a = 0; 在声明一个变量的时候指定变量的值,这叫做初始化;
int a; a = 2; 这叫做赋值。
2.auto变量处于运行时堆栈。它的特点:在调用一个函数的过程中,这个函数内部的auto变量才存在,当这个函数调用结束时,这些变量所占用的内存即被收回。如果多次调用一个函数,这个函数内部的auto变量在内存中的地址是不确定的。由于auto变量在内存中的地址不是一成不变的,所以在程序开始前,编译器无法确定它们的值,并不对它们进行初始化。
因此,auto变量未被初始化时,编译器也不知道你想要往这个变量里存什么,所以它的值是不确定的,毫无意义的,等着你在运行时给它进行赋值操作。
3.如果不对一个数组(非全局的、非静态的)进行初始化,这个和上面的变量未初始化一样,编译器不知道你要做什么,所以懒得浪费时间对它们进行初始化。
如果对一个数组进行部分初始化,形如:
int a[10] = {1, 2, 3};
未被初始化的部分a[3]~a[9]便会被编译器初始化为0。我的理解是,这是编译器认为你只关心数组a中前三个数的值,而后面的编译器为了让你省心就帮你初始化为0了,这时候编译器想“反正你都让我把前三个给填上了数,我也不怕麻烦了,后几个我给你填0吧”,于是编译器很大方地挥一挥衣袖把a[3]~a[9]填为0。
但是:
int a[10];
a[0] = 1;
a[1] = 2;
a[2] = 3;
这个时候a[3]~a[9]的值并不是0.因为这是运行时赋值,这个时候编译器已经下班了,所a[3]~a[9]中的值也是不确定的。 
4.最后,再说一下全局变量和一个函数内部的静态局部变量,它们并不是存储在运行时堆栈,在程序运行过程中,它们的在内存中地址是确定的,所以编译器就把它们初始化为0。

在C语言中,变量初始化赋值是两个相关但不同的概念。初始化是指在变量声明时为其赋予一个初始值,而赋值则是在变量声明之后通过赋值操作符(如`=`)为其赋予新的值。以下是关于变量初始化赋值的详细说明及示例。 ### 变量初始化 初始化通常发生在变量定义的同时,确保变量从一开始就具有一个明确的值。这种方式可以避免未初始化变量带来的不确定行为。 - **显式初始化**:在声明变量时直接为其赋值。 ```c int a = 10; // 整型变量的显式初始化 float b = 3.14f; // 浮点型变量的显式初始化 char c = 'A'; // 字符型变量的显式初始化 ``` - **隐式初始化**:某些情况下,编译器会为全局变量或静态变量自动进行默认初始化(例如整型变量默认为0)。 ```c static int d; // 静态变量的隐式初始化,默认值为0 ``` ### 变量赋值 赋值是指在变量已经声明的前提下,使用赋值操作符`=`将其绑定到一个新的值上。这种方式可以在程序运行过程中动态地修改变量的值。 - **基本数据类型的赋值**: ```c int e; e = 20; // 声明后进行赋值 float f = 5.67f; // 初始化 f = 8.9f; // 再次赋值 ``` - **结构体的初始化赋值**: 结构体是一种复合数据类型,其成员可以是不同的数据类型。结构体变量初始化可以在定义时完成,也可以在后续进行赋值。 ```c struct Point { int x; int y; }; struct Point p1 = {1, 2}; // 定义并初始化结构体变量 struct Point p2; p2.x = 3; // 赋值x成员 p2.y = 4; // 赋值y成员 ``` - **数组的初始化赋值**: 数组的初始化可以通过指定初始值列表来完成,而赋值则需要逐个元素进行。 ```c int arr[5] = {1, 2, 3, 4, 5}; // 初始化数组 int arr2[5]; arr2[0] = 10; // 赋值第一个元素 arr2[1] = 20; // 赋值第二个元素 ``` ### 示例代码 以下是一个完整的示例,展示了变量初始化赋值过程: ```c #include <stdio.h> struct Point { int x; int y; }; int main() { // 基本数据类型的初始化赋值 int a = 10; // 初始化 int b; b = 20; // 赋值 float c = 3.14f; // 初始化 c = 2.71f; // 再次赋值 // 结构体的初始化赋值 struct Point p1 = {1, 2}; // 初始化结构体 struct Point p2; p2.x = 3; // 赋值x成员 p2.y = 4; // 赋值y成员 // 输出结果 printf("a = %d\n", a); printf("b = %d\n", b); printf("c = %.2f\n", c); printf("p1: x = %d, y = %d\n", p1.x, p1.y); printf("p2: x = %d, y = %d\n", p2.x, p2.y); return 0; } ``` ### 总结 - 初始化是在变量声明时赋予初始值的过程,有助于避免未定义行为。 - 赋值是在变量声明后通过操作符`=`改变其值的过程。 - 对于复杂的数据结构(如结构体、数组),初始化赋值的方式略有不同,需根据具体情况进行处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值