1.宏 -- 宏的定义:宏就是一些命令组织在一起,作为一个单独命令完成一个特定任务 -- 宏是一个过程 -- 如何实现宏呢? -- 这里介绍一种实现宏的方法 -- #define -- 这个就是一个宏定义
比如这里我们就实现了一个 define定义宏 -- #define ADD(X,Y) X+Y -- X,Y是变量
在这里ADD(X,Y)应该被直接替换为 X+Y ,也就是实际转换结果为 -- 4*X+Y
这一个才是正确的宏定义
宏定义分为两种,一种是带参数的,一种是不带参数的
1.不带参数的定义宏 -- 通常用于定义程序中使用的符号常量
格式: #define 符号常量符 替换文本
符号常量符:宏名 -- 常用大写字母来表示,替换文本可以是c语言允许的标识符,关键字,数值,字符,字符串,运算符以及语句等
宏展开 -- 指通过预编译处理,程序中所有的符号常量名都被替换文本所替换。
注意点:
a. 字符串中与符号常量名相同的字符串不进行替换
b.宏定义 -- #define -- 只是一种简单的字符替换,不进行语法检查
c.每条宏定义必须单独占一行
d.宏定义不可以被多次定义(即已经被定义过的不能再定义),但宏定义中可以引用已经定义的数
e.宏定义与变量声明不同,宏定义只作字符替换,不分配内存空间
g.使用#undef 指令取消宏定义, 宏定义的作用范围是从第一次定义位置开始到#undef指令结束,如果没有对应的#undef指令,则到文件结束
格式 #undef 想要结束替换宏名
xuya
带参数的宏定义
宏定义可以带参数,这些参数相当于实际参数的占位符 -- 帮忙占位置,随时可替换
指令格式
#define 宏名(形参列表) 宏体
形参列表是由逗号分隔的宏的参数,这些参数需要看可以多次出现在宏体中引用。
带参数的宏定义不仅要进行字符串替换,还要进行参数替换
#define sum(a,b) a+b --- 1. 在对应位置首先sum进行字符串替换,变为a +b --- 2.其次再进行参数的替换 -- a+b被sum括号内的参数替换
sum(5,3) = 5+3 -- sum --> a+b --> 5+3
注意事项
1.宏定义时宏名与后面的括号之间没有空格,否则的话一个带参数的宏定义就会变成一个不带参数的宏定义
2.应该使用括号将带运算符的宏体和形参括起来!
((x)+(y) ) -- 总之就是把宏体和所有形参都括起来,这样子就能有效避免
1.宏体内部未视为完整表达式带来的错误2.使用宏时未将宏体未被视为完整表达式时带来的错误。
3.宏定义不存在类型问题,宏名无类型,其参数也无类型
指针与数组
对于一维数组而言,设一个一维数组 a[10]
a是首元素的地址 -- *(a+i) -- 为第 i 个的元素的值
二维数组 s[3][3] 的分析方法是拆分法 --> 先把它看作一个一维数组,其元素是由其每一行构成的一个一维数组 -- 其作为一维数组时每个元素的索引是 s[ 0 ] ,s[ 1 ], s[ 2 ] ,而这些一维数组元素的数组名就是它们的索引
更深层次的分析 -->
首先一个二维数组是多个一维数组的集合 --- 二维数组的本质依然是一维数组,二维数组的分析依然建立在一维数组之上,而这些组成二维数组的一维数组就是其基本元素(如一个字符,一个数字这种最基本的元素,数组中的元素分为两种,一种是基本元素,一种是复合元素,复合元素由基本元素组成,如字符和字符串,数组中开辟好内存空间后只能够存储基本元素) --- 而当数组作为基本元素的时候我们并不会开辟一个内存空间来存贮这个数组 --- 我们会选择存贮这个数组的首地址这种更高效的方式 --- 也就是说二维数组其实是一个指针数组,其内存储的是组成它的一维数组的元素的首地址
参照上面这种理解方法我们可以将二维数组理解为两个维度的叠加,每一个维度中都有一个一维数组,通过不停的降维,最终我们可以找到二维数组中的每个元素 --- 二维数组找具体某个元素是通过降维的方法来实现的!! 而多维数组维度的信息和降维的顺序都清晰的写在了多维数组的定义中
如 a[ 3 ][ 4 ]
1.有多少个下标引用操作符就有多少个维度
2.维度从左往右不断降低
3.第一维的一维中存的是所有基本元素,第二维的一维数组中存的是所有第一维数组的首元素地址,第三维存第二维所有....首元素的地址....
4.若要访问第一维的具体某个元素 -- a[ 3] [ i ] ; 若要访问第二维的具体某个元素 -- a[ i ] 注意a[ i ]是以一个地址。
5.一维数组的所有性质在每一个维度中都适用
6.多维数组的数组名是最高维度中的一维数组的首元素的地址,
综上我们可有
一.(以二维数组为例)a[ i ] --- 表示的是二维数组中的第i个元素 --- 而这第i个元素就是一个地址!且是对应下一维数组的首元素的地址; a[ i ][ j ] -- 表示的就是一个具体的元素
关于下标引用操作符的运行原理
解引用操作符的作用是告诉计算进行一个解引用操作,而这个操作的操作对象(操作数)就是解引用操作符左边和括号里的两个数,且操作格式是
: a[ b ] < == > *( a + b ) a是数组首元素地址,b是对应下标 而这也等价于 < == > *(b+a) < == > b[ a ]
综上,也就是说下标引用操作符的两个操作数可以相互交换位置且不改变结果,因为哪怕交换了位置,下标引用操作符的操作格式仍不发生改变。
指针数组是一个存放指针的数组,数组指针则是存放数组首元素地址的指针