1C语言学习记录,数据类型,如何定义变量,、变量的赋值,作用域,生命周期,运算符号

本文深入探讨C语言中的数据类型、内存分配原则、变量的生命周期与作用域,以及基本运算符的使用。通过实例讲解如何定义变量,理解局部变量与全局变量的区别,并解析变量在不同段的存储位置。

数据类型。

1、什么是数据类型?
数据类型描述了一个变量究竟存放着什么数据。

数据类型分为基本数据类型与非基本数据类型。
基本数据类型:char short int long float double。
非基本数据类型:数组、指针、结构体

2、研究一下基本数据类型在内存中占用的空间问题?
例子:假设有一个整型变量,那么这个变量在内存中占用多少个字节?
看这个变量对应的数据类型是占用多少个字节。

等价于:
有以下的程序,请问在运行程序的过程中占用内存多少个字节?

int main(int argc,char *argv[])
{
	int a;
	return 0;
}

sizeof() -> 计算内存占用字节的大小。
sizeof(char) -> 计算一个char类型的数据在内存中占用多少个字节数。

#include <stdio.h>

int main(int argc,char *argv[])
{
	printf("sizeof(char) = %ld\n",sizeof(char));//1
	printf("sizeof(short) = %ld\n",sizeof(short));//2
	printf("sizeof(int) = %ld\n",sizeof(int));//4
	printf("sizeof(long) = %ld\n",sizeof(long));//8
	printf("sizeof(float) = %ld\n",sizeof(float));//4
	printf("sizeof(double) = %ld\n",sizeof(double));//8
	
	return 0;
}

结论: 基本数据类型占用空间的大小由编译系统来决定的。

如何定义变量?

1、定义公式: 数据类型 变量名

数据类型: 从基本数据类型中选择,也可以从非基本数据类型中选择。
变量名:有一套规则。
1)只能由字母,数字,下划线组成。 int a+5
2)不能以数字开头。 int 5_a
3)不能与系统的关键字重名 int If (对) int if (错)

例子1: 定义一个整型变量,名字为x。
int x;

例子2: "int x"这句话是什么含义?
在内存空间中连续申请4个字节的空间,然后使用变量x间接访问这片内存空间。

int main(int argc,char *argv[])
{
int x; -> 申请了连续4个字节空间。
return 0; -> 程序结束就会释放空间。
}

2、内存分配原则? -> 连续空闲不确定。
1)在分配内存时,内存地址一定是连续。
2)在分配内存时,一定是空闲。(之前的变量申请过的空间就不会再被申请到)
3)分配内存时,位置是不确定。

变量的赋值,作用域,生命周期。

1、变量的赋值。
使用"=“来对变量进行赋值,”=“的作用把”=“右边的值赋值给”="左边的值。

1)定义变量的同时初始化。
int x = 100; -> x不会出现随机值。

2)先定义,后初始化。
int x; -> x = 随机值
x = 100; -> x = 100

2、变量的生命周期与作用域。
生命周期:这个变量从什么时候开始出现在内存空间到什么时候从内存空间中释放这个过程。
作用域:在程序中,这个变量能够作用到的地方。

局部变量 Vs 全局变量

1)什么是局部变量?什么是全局变量?
在程序函数体内部定义的变量就是局部变量,在函数体外定义的变量就是全局变量。

int x; -> 全局变量
int main(int argc,char *argv[])
{
int a; -> 局部变量
}

2)两者在内存空间中申请的位置区别?
局部变量申请的空间位置,一定在栈区。
全局变量未初始化过就是在bss段,已初始化过就是在data段。

int c = 10; -> c在data段,10是常量区
int d; -> d在bss段

int main(int argc,char *argv[])
{
int a = 100; -> a在栈区 100在常量区
int b; -> b在栈区
return 0;
}

3)初始化值
局部变量: 随机值
全局变量: 0

4)生命周期
局部变量在函数中定义时开始,在定义的函数返回时,就会释放这个空间。
全局变量一开始就会申请,等到程序结束才会释放。

5)作用域
局部变量:只能在定义该变量的那个函数中使用。
全局变量:整个程序中所有的函数都可以使用。

思考题?
1、形式参数"int x"是属于局部变量还是全局变量?
属于局部变量,所以需要申请空间,还有就是在函数结束时会释放。

int fun(int x) //x = 10
{
x -> 就是局部变量
int y;
}

int main()
{
fun(10);
}

2、能不能在不同的函数中定义相同的变量名?
可以。

int fun()
{
int y;
}

int main()
{
int y;
}

3、全局变量可以跟局部变量同名吗?
可以重名。如果重名,打印出来的值就是局部变量。

4、全局变量作用域只能往下,不能网上。

练习4: 请求出以下程序的结果。 (考点: 局部变量的生命周期)

int my_fun(int c)
{
	c = c/5;
	return c;
}

int fun(int a,int b)
{
	int c;
	c = a + b;
	my_fun(c);
	return c;
}

int main(int argc,char *argv[])
{
	int a = 10,b = 5;
	int ret = fun(a,b);	
	printf("ret = %d\n",ret); //15
	return 0;
}

运算符号。

" + - * / % = & && | || == != ++ – += -= *= /= %= "

1)把浮点型赋值给整型变量,那么精度就会降低。(把小数点后面的数据弄丢了)
2)

int c = 5/2;
printf("c = %d\n",c);//2
	
float e;
e = 5/2;
printf("e = %f\n",e);//2.000000
	
float f;
f = 5.0/2;
printf("f = %f\n",f);//2.500000
	
float g;
g = 5/2.0;
printf("g = %f\n",g);//2.500000 (对)
						 //2.000000 (错)
float h;
h = 5.0/2.0;
printf("h = %f\n",h);//2.500000
	
int i;
i = 5.0/2.0;
printf("i = %d\n",i);//2

3)%两边不可以由小数点。

4)& -> 位与运算

5&6

5 -> 0101
6 -> & 0110

   0100  -> 4

&& -> 逻辑与运算 -> 非0即真

5&&6

5 -> 非0 -> 真
6 -> 非0 -> 真

| -> 位或运算

5|6

5 -> 0101
6 -> | 0110

   0111  -> 7

||

5||6

5 -> 非0 -> 真
6 -> 非0 -> 真

<think>嗯,用户问的是C语言中普通变量和静态变量作用域生命周期。我得先回忆一下相关知识,然后组织好语言解释清楚。首先,普通变量可能指的是自动变量,也就是在函数内部定义的局部变量,而静态变量则分为静态局部变量和静态全局变量。需要分开讨论。 作用域方面,自动变量作用域仅限于定义它的代码块内部,比如函数或循环体内。静态局部变量作用域同样限于定义它的代码块,但生命周期不同。静态全局变量作用域则是整个文件,但加上static后不会被其他文件访问到。生命周期的话,自动变量在离开作用域时销毁,而静态变量存在于整个程序运行期间。 可能用户混淆了普通变量和静态变量的区别,特别是作用域生命周期的差异。需要举例说明,比如函数内定义的自动变量每次调用都会重新初始化,而静态局部变量会保留之前的值。同时,静态全局变量和普通全局变量的区别在于链接属性,静态的只能在文件内访问。 还要注意用户可能是在学习变量存储类别,或者遇到变量值不被保持的问题,所以需要明确两者的使用场景。比如静态变量用于需要保持值的场合,自动变量则用于临时存储。要确保例子准确,语法正确,比如使用大括号定义变量,可能是指代码块内的变量,比如在if或for循环中定义变量,这些也是自动变量作用域更小。 另外,要检查是否有遗漏的情况,比如静态全局变量和普通全局变量作用域区别,是否需要用extern,或者是否被其他文件访问。同时,生命周期部分要强调静态变量在程序启动时初始化,只初始化一次,而自动变量每次进入作用域时创建。 最后,总结对比两者的差异,帮助用户更好理解。可能用户需要应用这些知识来解决问题,比如为什么某个变量值没有被保留,或者为什么其他地方无法访问某个变量,这时候作用域生命周期的知识就很重要了。确保回答结构清晰,分点说明,用例子辅助解释,避免使用复杂术语,保持简洁明了。</think>好的,我将分步解释C语言中普通变量(自动变量)和静态变量作用域生命周期,并提供代码示例帮助理解。 ### 一、普通变量(自动变量1. **定义方式** 在代码块(大括号`{}`内)定义,无`static`修饰,例如: ```c void func() { int a = 10; // 普通变量(自动变量) } ``` 2. **作用域** - 仅在其**定义的代码块内部**可见 - 例如在`if`或`for`内部定义变量: ```c for (int i=0; i<5; i++) { int temp = i*2; // temp仅在循环体内有效 } ``` 3. **生命周期** - 从**进入代码块时分配内存** - 到**离开代码块时自动释放** - 每次进入代码块时变量会被**重新初始化** 4. **示例分析** ```c void test() { int count = 0; count++; printf("%d\n", count); // 每次输出都是1 } ``` ### 二、静态变量(static修饰) 1. **静态局部变量** - **定义方式**:在代码块内加`static`修饰 ```c void func() { static int b = 0; // 静态局部变量 } ``` - **作用域**:与普通变量相同(仅代码块内) - **生命周期**: - **程序运行期间一直存在** - 初始化**仅执行一次** - 离开代码块时值会被保留 - **示例分析**: ```c void test_static() { static int count = 0; count++; printf("%d\n", count); // 输出1,2,3... } ``` 2. **静态全局变量** - **定义方式**:在函数外使用`static`修饰 ```c static int global_var; // 静态全局变量 ``` - **作用域**: - 仅限**当前源文件**内部访问 - 其他文件无法通过`extern`引用 - **生命周期**:程序运行期间一直存在 ### 三、对比总结 | 特性 | 普通变量(自动变量) | 静态局部变量 | 静态全局变量 | |-----------|---------------------|---------------------|---------------| | 作用域 | 定义它的代码块内部 | 定义它的代码块内部 | 当前源文件内部 | | 生命周期 | 代码块执行期间 | 整个程序运行期间 | 整个程序运行期间 | | 初始化次数 | 每次进入代码块时重新初始化 | 仅初始化一次 | 仅初始化一次 | | 存储位置 | 栈内存 | 数据段 | 数据段 | | 跨文件可见性 | - | - | 不可见(文件作用域) | ### 四、关键差异说明 1. **作用域限制** 普通变量严格受代码块限制,静态变量通过`static`实现作用域控制(局部静态不扩大作用域,全局静态缩小链接范围)。 2. **生命周期差异** 普通变量适合临时数据,静态变量适合需要保持状态的场景(如计数器、单例模式)。 3. **典型应用场景** - 普通变量:函数内部临时计算 - 静态局部变量:实现函数调用间的状态保持 - 静态全局变量:限制跨文件访问的共享数据 需要特别注意:静态变量在程序启动时初始化(未显式赋值则自动初始化为0),而普通变量的初始值是不确定的(若未显式初始化)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值