C语言——变量进阶、内存、高级宏

本文详细介绍了C语言中的变量,包括局部与全局变量、作用域、定义与声明的区别、链接属性、生存期和存储类型。此外,还探讨了动态内存管理,如malloc、free、calloc和realloc的使用,以及内存分配的区域和堆栈的区别。最后,讲解了宏定义,包括无参数和带参数的宏、宏的字符串化和连接运算符,以及可变参数的使用。
摘要由CSDN通过智能技术生成

一.变量

A.局部变量与全局变量。

体现例子:不同函数之间的变量无法互相访问。

#include <stdio.h>

int main()
{
	int i = 520;

	printf("before, i = %d\n", i);

	for (int i = 0; i < 10; i++)//c99中for语句第一个表达式才能定义变量。
	{
		printf("%d\n", i);
	}
	printf("after, i = %d\n", i);

	getchar();
		return 0;
}

 因为i所对应的作用域不同所以for在声明i没有报错。

全局变量:指在函数外所定义的变量,受所有函数所共用。

局部变量:指在函数内部所定义的变量,只能作用域其函数内部,受其函数所使用。

全局变量如果没有初始化,它会自动初始化为0。

如果函数内部存在一个与全局变量同名的局部变量,编译器并不会报错,而是在函数中屏蔽全局变量。(也就是这个函数内,全局变量不起作用)

例:

#include <stdio.h>

void func();

int a, b = 520;

void func()
{
	int b;

	a = 880;
	b = 120;

	printf("In func ,a = %d, b = %d\n", a, b);
}
int main()
{
	printf("In main ,a = %d, b = %d\n", a, b);
	func();
	printf("In main ,a = %d, b = %d\n", a, b);

		getchar();
		return 0;
}

结果:

In main ,a = 0, b = 520
In func ,a = 880, b = 120
In main ,a = 880, b = 520

建议:不要大量的使用全局变量。

因为    1.大量占用内存。    2.污染命名空间,使程序可读性降低。    3.提高了程序的耦合性,代码长了就不知道全局变量被那些函数所修改过。

B.作用域。

含义:当变量被定义在程序的不同位置时,它所作用的范围是不一样的,这个范围被称为作用域。

分类:

代码块作用域("{}"在其内部的作用域)

文件作用域(作用于一个文件或者多个文件时[多个文件先用头文件包含进去然后再用extern关键字告诉编译器此变量已被定义])

原型作用域(只适用于那些在函数原型中声明的参数,相当于函数的声明参数与函数的定义参数。)

函数作用域(只适用于goto语句的标签,限制goto语句的标签在同一个函数内部,以防出现重名标签。)

C.定义与声明的区别。

定义:变量被定义时,编译器为其变量申请内存空间并填充其值。

声明:变量被声明时,编译器就知道该变量被定义在其他地方。

注意:1.局部变量既是定义也是声明。    2.定义只能出现一次,而声明可以很多次。

D.链接属性。

external(外部):多个文件中声明的同名标识符表示同一个实体

internal(内部):单个文件中声明的同名标识符表示同一个实体

none(无):声明的同名标识符被当作独立不同的实体

注:1.只有具备文件作用域的标识符才能拥有external、internal属性(函数、全局变量等等),其他作用域的标识符是none属性。

        2.默认情况下具备文件作用域的标识符拥有external属性。

        3.使用static关键字可修改拥有external属性的标识符为internal属性。只针对具有文件作用域的标识符生效。

        4.链接属性只能修改一次。修改后不能再改回来。

E.生存期。

类型:静态存储期、自动存储期

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值