C语言学习(4)

变量的作用域

变量的作用域,就是变量值(声明)的有效范围
1)函数内部声明、定义的局部变量,作用域仅限于函数内部
2)函数的参数,形参,被当作该函数内的局部变量,如果全局变量同名他们会优先使用(编译器使用变量为就近原则
3)在一个代码块,比如for、if中的局部变量,那么这个变量的作用域就在该代码块中
4)在所以函数外部定义的变量叫全局变量,作用域在整个程序中有效

全局变量和局部变量
1)局部变量,系统不会对其默认初始化,必须对局部变量初始化后才能使用,否则,程序运行后可能会异常退出。
2)全局变量,系统会自动对其初始化

数据类型初始化默认值
int0
char‘\0’
float0.0
double0.0
poonter指针NULL

作用域的注意事项和细节
1)全局变量保存在内存的全局存储区中,占用静态存储单元,它的作用域默认是整个程序,也就是所有的代码文件,包括源文件和头文件
2)局部变量保存在中,函数被调用时才动态地为变量分配存储存储单元,他的作用域仅限于函数内部
3)C语言规定,只能从小的作用域向大的作用域中寻找变量,而不能反过来
4)在同一作用域,变量名不能重复,在不同的作用域,变量名可以重复,使用时编译器采用就近原则
5)由{}包围的代码块也拥有独立的作用域
C程序的内存布局图

static关键字

static关键字在C语言中比较常用,使用恰当能够大大提高程序的模块化特性,有利于扩展和维护
(1)局部变量使用static修饰
1)局部变量被static修饰后,成为静态局部变量
2)对应静态局部变量在声明时未赋值,编译器也会把它初始化为0
2)静态局部变量存储在进程的静态存储区(全局性质),只会被初始化一次,即函数返回(销毁),它的值也会保持不变
(2)全局变量使用static修饰
1)普通全局变量对整个工程可见,其他文件可以使用extend外部声明后直接使用。即其他文件不能再重新定义一个与其相同的变量名了,静态全局变量仅对当前文件可见,其他文件不可访问,其他文件可以定义与其同名的变量,两者互不影响
2)定义不需要与其他文件共享时的全局变量时,加上static关键字能够有效地降低程序模块之间的耦合,避免不同文件同名变量的冲突,且不会误使用
(3)函数使用static修饰
1)函数的使用方式与全局变量类似,在函数返回值前加上static,就是静态函数
2)非静态函数可以在另一个文件中通过extern引用
3) 静态函数只能在声明它的文件中可见,其他文件不能引用该函数
4)不同的文件可以使用相同名字的静态函数,互不影响

基本数据类型和字符串的转换

(1)基本数据类型转换到字符串类型(sprintf函数)
1)sprintf和平时常用的printf函数的功能很相似。sprintf函数打印到字符串中,而printf函数打印输出到屏幕。
2)该函数包含在stdio.h的头文件中。

int a = 10;
sprintf(str, %d, a);//将a转换为字符串,复制给str

(2)字符串转换到基本数据类型
语法:通过stdlib.h的函数调用atoi、atof即可
1)在将char数组类型转成基本数据类型时,要确保能够转成有效的数据
2)如果格式不正确,会默认转换成0或者0.0

预处理命令

(1)基本介绍

  1. 使用库函数之前,应该用#include引入对应的头文件。这种以#号开头的命令称为预处理命令
  2. 这些在编译之前对源文件进行简单加工的过程,称为预处理
  3. 预处理主要是处理#开头的命令,预处理命令要放在所有函数之外,而且一般都放在源文件的前面
  4. 预处理是C语言的一个重要功能,由预处理程序完成,当对一个源文件进行编译时,系统将自动调用预处理程序对源程序中的预处理部分做处理,处理完毕自动进入对源程序的编译
  5. C语言提供了多种预处理功能,如宏定义、文件包含、条件编译等,合理地使用会使编写的程序便于阅读、修改、移植和调试,也有利于模块化程序设计

(2)宏定义
1)#define叫做宏定义命令,就是用一个标识符来表示一个字符串,如果在后面的代码中出现了该标识符,那么就全部替换成指定的字符串。
2)宏定义是由源程序中的宏定义命令#define完成的,宏替换是由预处理程序完成的

#define 宏明 字符串
1)#表示这是一条预处理命令,所以的预处理命令都已#开头。宏名是标识符的一种,命名规则和变量相同。字符串可以是数字、表达式、if语句、函数等
2)这里的字符串是一般意义上的字符串序列,不要和C语言中的字符串等同,它不需要双引号
3)程序中反复使用的表达式就可以使用宏定义

注意事项
1)宏定义是用宏名来表示一个字符串,在宏展开时又以该字符串取代宏名,这只是一种简单的替换,预处理程序对它不做检查,如有错误,只能在编译已被宏展开后的源程序时发现
2)宏定义不是说明或这语句,在行末不必加分号,如加上分号也会一起替换
3)宏定义必须写在函数之外,其作用域为宏定义命令起到源程序结束。如果要终止其作用域可使用#undef
4)代码中的宏名如果被引号包围,那么预处理程序不对其作宏代替
5)宏定义允许嵌套,在宏定义的字符串可以使用已经定义的宏名,在宏展开时又预处理程序层层代换
6)习惯上宏名用大写字母表示,以便于与变量区别
7)可用宏定义表示数据类型,使书写方便
8)宏定义表示数据和用typedef定义数据说明符的区别:宏定义只是简单的字符串替换,由预处理器来处理;而typedef是在编译阶段由编译器处理的,它并不是简单的字符串替换,而是给原有的数据类型起一个新名字,将他作为一种新的数据类型

带参数的宏定义
1)C语言允许宏带参数。在宏定义中的参数称为“形式参数”,在宏调用中的参数称为“实际参数”,这与函数类似。
2)对带参数的宏,在展开过程中不仅要进行字符串的替换,还要用实参取替换形参
3)带残宏定义的一般形式为**#define 宏名(形参列表) 字符串**,在字符串中可以含有各个形参
4)带惨宏调用的一般形式为:**宏名(实参列表)**2
注:
1)带参宏定义中,形参之间可以出现空格,但是宏名和形参列表之间不能有空格出现
2)在带参宏定义中,不会为形参分配内存,因此不必指明数据类型,。而在宏调用,实参包含了具体的数据,要用他们去替换形参,因此实参必须要指明数据类型
3)在宏定义中,字符串内的形参通常要用括号括起来以避免出错

带参宏定义和函数的区别
1)宏展开仅仅是字符串的替换,不会对表达式进行计算;宏在编译之前就被处理掉了,它没有机会参与编译,也不会占用内存。
2)函数是一段可以重复使用的代码,会被编译,会在计算机内分配内存,每次调用函数,就是执行这块内存中的代码

指令说明
#空指令
#include包含一个源代码文件
#define宏定义
#undef取消已定义的宏
#if如果给定的条件为真,则编译下面的代码
#ifdef如果宏有定义,则编译下面的代码
#ifndef如果宏没有定义,则执行下面的代码
#elif如果前面的#if给定条件不为真,当前条件为真,则编译下面的代码
#endif结束一个#if…#else条件编译块
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值