- UID
- 3388
- 积分
- 3292
- 精华
- 贡献
-
- 威望
-
- 活跃度
-
- D豆
-
- 在线时间
- 小时
- 注册时间
- 2002-3-28
- 最后登录
- 1970-1-1
|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
本帖最后由 newer 于 2017-7-30 20:26 编辑
第一章 基础知识
一 数制及转换
1. 四种数制:二进制 十进制 八进制 十六进制
(1)十进制定义
0-9十种编码符号
逢十进一
(2)二进制定义
0 1二种编码符号
逢二进一
(3)八进制定义
0-7八种编码符号
逢八进一
(4)十六进制定义
0-9 A-F 十六种编码符号
逢十六进一
2. 四种数制转换:
(1)十->二进制
口诀:除(以)二取余倒排
(2)二->十进制
口诀:按位乘权相加
(3)二->八进制
口诀:三位压成一位
二 八
000 0
001 1
010 2
011 3
100 4
101 5
110 6
111 7
(4)八->二进制
口诀:一位展成三位
(5)二->十六进制
口诀:四位压成一位
(6)十六->二进制
口诀:一位展成四位
二 数制应用
1. ASCII码
2. 内存
3. 机器码
4. 地址映射(1K = 210)
5. IP地址
第二章 C语言组成及数据
一 C语言组成
1. 组成: 若干文件
2. 文件: 若干函数
3. 函数: 函数头+函数尾
4. 函数头: 四部分->函数名+()
5. 函数体: {}+语句
6. 语句: 三类语句
类型1: /* */注释语句
类型2: 定义语句;
类型2: 执行语句;(五类)
图1
二 数据与数据类型
1. 数据四类: 常量 变量 表达式 函数
(1)常量: 值不发生变化的量
常量四类: 整形 实型 字符型 字符串型
*整形常量: 三种形式(十进制 八进制 十六进制)
八进制: 0... 十六进制: 0x(0X)...
长整型: ...l
*实型常量: 两种形式(小数 指数)
e前后必须都有数字,且后必为整数
e前后及数字间不能有空格
*字符型常量: 四种形式(常规 转义 八进制 十六进制)
'A' '\n' '\ddd' '\xhh'
*字符串常量:一种形式(" ")
每个字符串尾都有一个结束符'\0'
C语言没有字符串变量
(2)变量: 值随时改变的量(存常量)
变量使用规则: 先定义 后使用
注: *变量必须先定义后使用
*变量名属于用户标识符, 遵守命名规则
*在同一"{ }"中, 不能定义同名变量名
*同时定义多变量, 必须用逗号分隔
*变量可赋初值, 无初值是随机值
(3)表达式: 用运算符讲数据连接起来的合法式子
定义: 用运算符将数据连接起来的合法式子
运算符三个属性:功能 优先级 结合性(运算方向)
*算数运算符及算术表达式:
+ - * / %
'%'前后必为整形
余数与被除数符号一致
*赋值运算符及赋值表达式:
=
注
'='左边必须是一个变量
'='右边可以是合法表达式
赋值表达式的值就是赋值运算符左边的变量值
*复合赋值运算符
+= -= /=......
注: 符合赋值运算符的两个运算符中间不能有空格
*自增 自减运算符 ++ --(只能在变量前后)
i++ 先标(表达式值)后加(变量值)
++i 先加(变量值)后标(表达式值)
*逗号运算符及其表达式("顺序求值"表达式)
格式: 表达式1, 表达式2, ...,表达式n
功能: 逗号表达式的值就是表达式n的值, 求值顺序从左到右
*强制类型转换(显式转换)
格式 : (类型名)表达式 / (类型名) (表达式)
(4)函数: 调用具有一定功能的函数作为运算量
函数两类: 标准函数 自定义函数
2. 数据类型四大类: 基本类型(内置类型) 构造类型 指针类型 空类型
基本类型: 整形 字符型 浮点型
构造类型: 数组型 结构体类型 共用体类型 枚举类型
指针类型: *
空类型: void
3. 标识符三类
保留字(关键字): 共32个,固定含义
预定义标识符: 预先定义并具有特定含义的标识符
用户自定义标识符: 由用户根据需要定义的标识符
注:
第一个字符必须是字母或下划线,后面可以是字母,数字,下划线
大小写有区别 |
第三章 顺序结构
一 定义
从main()开始,由上往下一条条执行
二 3大类语句->执行语句: 5类
控制语句(9条)
函数调用语句;
表达式语句;
空语句;
符合语句{ }
三 顺序结构的程序设计框架
#include <>
main()
{
输入 直接赋值/键盘输入
计算
输出
}
#include <stdio.h>
int main(void)
{
int x, y, z;
float aver;
scanf("%d%d%d", &x, &y, &z);
aver = (x+y+z)/3.0;
printf("%d", aver);
return 0;
}
输出如何实现?
"标准输入输出函数"是以一些库函数来实现的
注意: 标准函数/库函数使用前必须:
#include<头文件>
学习方法: 头文件名+函数的使用格式
1. printf()
格式1: printf("格式控制");
功能: 按格式控制指定的格式输出数据
格式2: printf("普通/占位符", 输出列表的值);
功能: 按格式将值输出
注意: "占位符"以%开始,被替换
"普通字符"将原样输出
输出值, 先计算后输出
占位符字符:d | 带符号十进制整数 | u | 无符号十进制整数 | o | 无符号八进制整数 | X/x | 无符号十六进制整数 | c | 输出一个字符 | s | 输出一个字符串 | f | 输出一个实型数 隐含输出6位小数 | E/e | 输出指数形式实型数 |
2. scanf()
格式: scanf("普通/占位符", 地址列表);
五考点
考点1: "普通/占位符", 输入时普通字符必须原样输入
考点2: "占位符", 输入时4种输入(%d)
空格 ↙ tab 混合使用
考点3: "占位符", 输入时1种输入(%c)
考点4; "占位符", 输入时1种输入(混合)
考点5: 地址列表, 输入时&
四 字符数据的输入输出
putchar() getchar()
学习方法: 头文件名+函数的使用格式
1. putchar()
格式: putchar(字符常量或字符变量)
功能: 输出一个字符但不输出单引号
2. getchar()
格式: getchar()
功能: 接收一个从键盘输入的字符
注: getchar()没有任何参数, 函数的返回值就是输入的字符
第四章 选择结构
一 定义:
从main()开始, 由上往下有些语句执行, 有些不执行
二 两类语句->执行语句 控制语句
1. 两类表达式
(1)关系运算符及关系表达式(逻辑值0/1)
< <= > >= == !=
三要素: 功能 优先级 结合性
5>4>3 => 0
1<2<1 => 1
(2)逻辑运算符与逻辑表达式(0/1)
&& || !(单目)
*在C语言中逻辑表达式的值只有1/0两种值
&&: 全真为1, 有0为0
|| : 全0为0, 有真为1
♠ date1&&date2 若date1为0,则不执行date2, 逻辑与短路
♠ date1||date2 若date1为1,则不执行date2,逻辑或短路
表达式运算:
①判断合法性
②短路优先考虑
③优先级, 同级结合性
2. if语句(三种格式)
格式1:
if (表达式)
语句序列1; =>if子句
后继语句
格式2:
if (表达式)
语句序列1;
else //else必须有对应的if
语句序列2;
后继语句
格式3: if语句的嵌套 else找配对:在上, 最近, 未与其他else配对
if(表达式1)
if(表达式2)
语句序列11;
else
语句序列12;
else
语句序列2;
后继语句
3. switch语句
格式:
switch(表达式)
{
case 常量表达式1: 子句1; break;
case 常量表达式2: 子句2; break;
......
case 常量表达式n: 子句n; break;
default: 子句n+1; //可省略
}
/*
1. switch后必用小括号将表达式括起
2. case后常量必为整型或字符型,不能有变量和逗号运算符
3. 各case后不能出现相同的值
*/
第五章 循环结构
一 定义: 从main()开始, 从上向下,使得某些语句重复执行
二 循环结构的程序: 在顺序结构中加入循环控制语句
循环控制语句(四类)
格式1----while语句(当型循环)
while(表达式)
{
循环语句序列;
}
后继语句;
说明:
1. 执行过程
2. 表达式在括号中
3. while控制一条语句
4. 复合语句算一条
格式2----do~while语句(直到型循环)
do
循环体语句序列;
while(表达式);
后继语句;
说明:
1. 执行过程
2. do~while(表达式)
3. do-->while配对
4. do就近控制一条语句,若控制多条,加{ }
5. 循环语句至少执行一次
格式3----for语句
for(exp1; exp2; exp3)
{
循环体语句;
}
后继语句;
说明:
1. 执行过程
2. exp1-初始化->执行1次
exp2--条件-->判断
exp3-------->增量
3. exp2-永为真->死循环
4. 两次分号, 三个表达式
5. 若exp2为空,则系统自动取1,永为真
格式4----if goto配合使用(少用)
两个控制语句----break continue
格式: break; (跳出)
功能: 中止退出
范围: 循环体中和switch体
格式: continue; (跳回)
功能: 结束一次循环,继续下次循环
范围: 循环体中
1. for--跳回-->exp3
2. while/do while--跳回-->表达式
第六章 数组
特点: 同一数组中的所有元素都属于 同一种数据类型, 数组元素用数组名和相应的下表来确定
方法: 一个数组元素其实就是一个变量(可以称为带下标的变量)
一 一维数组的定义和引用(只有一个下标)
1. 一维数组定义格式:
类型名 数组名[常量表达式];
定义数组有四个注意:
(1)数组名属于用户自定义标识符, 要遵守标识符命名规则
(2)定义一维数组时, 数组名后必须用一个方括号将常量表达式括起来, 常量表达式的值表示所定义数组共有多少个元素(数组长度或数组的大小)
(3)定义数组时方括号中的 表达式不能含有变量. 另外表达式的值必须为正整数
(4)C语言每个数组在内存中分配空间时是连续分配的
2. 一维数组元素的引用格式:
数组名[下标]
♠先定义 后使用
♠不能整体用数组, 只能单独引用其中的元素, 引用时下标可以是表达式
♠数组元素的下标值在0~N-1之间
3. 一维数组初始化:
格式:
类型名 数组名[常量表达式]={初值1, 初值2, ...};
注意:
(1)定义一维数组时可以将各元素的初始值依次放在一对{ }中赋给数组
(2)多则出错, 少则补零
(3)定义赋初值的个数等于数组长度, 数组长度可以省略
(4)一个也不给则是随机值
(5)只能在定义数组的同事用{ }给数组元素整体赋值
二 二维数组的定义个引用(有两个下标)
1. 二维数组的定义格式:
类型名 数组名[常量表达式1][常量表达式2];
注: (1)数组名要遵守用户自定义标识符的命名规则
(2)定义二维数组第一个方括号常量表示行数, 第二个方括号常量表示列数
(3)定义数组时方括号中的表达式不能含有变量, 且表达式的值必须是正整数
(4)在内存中二维数组元素的存放也是连续的, 先行后列原则
2. 二维数组元素的引用
数组名[行下标][列下标]
3, 二维数组的初始化
方法1: 将初值依次放在一对{ }中, 与一维数组初始化格式相同
方法2: 定义二维数组同时, 按行初始化每一行初值均用一对{ }括起, 采用嵌套{ }
注意: 定义二维数组的同时给数组初始化,可以省略行数,但列数不能省略
三 字符数组
C语言中没有字符串变量,那么如何存储
字符数组 字符型指针
1. 字符数组的初始化
与其它类型数组的初始化方式一样,只是其初始值是字符
2, 字符串
因为字符串最后都有一个字符串结束符('\0'), 所以用字符数组来存放字符串时一定要有一个元素存放结束符'\0'
字符串给字符数组初始化的方法
(1)char a[5]="abcd";
(2)char a[5]={"abcd"};
(3)char a[5]={'a','b','c','d', '\0'};
♠双引号能省略{ }
♠双引号自动加'\0', 长度加1
四 数组的使用
1. 一维数组的使用
结构: 找配对 找控制 标语句
过程: 画图
2. 二维数组的使用
双重for循环
3. 字符串使用
(1)字符串存储(赋值)四种方法
方法1: scanf(); 键盘输入
scanf("%s", a);
scanf("%s", &a); 非法, 数组名本身为地址
注: 用%s格式输入时, 遇到空格符或回车符则自动结束输入
printf(); 输出
注: 输出时则从当前地址开始, 直到遇到结束符
方法2: gets(); 键盘输入
格式: #include<stdio.h>
gets(字符数组);
功能: 读取一个字符串赋给字符数组
注:
(1)该函数输入字符时, 只有遇到回车符系统才结束读取字符
(2)不论是用%s还是gets( )在作为输入时, 均不需要输入双引号, 若输入时用了双引号则双引号也作为字符串的有效字符
puts(); 输出
格式: #include<stdio.h>
puts(字符数组或字符串常量);
功能: 在屏幕上输出字符数组中的字符
注: 用该函数输出与用%s格式输出一样, 只是该函数将'\0'转成'\n'输出
方法3: 字符串初始化
方法4: strcpy();
strcpy(a, "abcd");
(2)字符串函数(处理)
第一个函数: strcat()
格式: #include<string.h>
strcat(字符数组1, 字符数组2)
功能: 连接
第二个函数: strcpy()
格式: #include<string.h>
strcpy(字符数组1, 字符数组2)
功能: 将字符数组2中的字符串替换到字符数组1中, 函数值为字符数组1的首地址
第三个函数: strcmp()
格式: #include<string.h>
strcmp(字符数组1, 字符数组2)
功能: 函数返回 相同位置不同字符的ASCII码差值
注: 不能用关系运算符直接进行字符串大小或字符串数组大小的比较
第四个函数: strlen()
格式: #include<string.h>
strlen(字符数组)
功能: 求出字符数组的实际长度, 不包括结束符
第七章 函数与预编译
一 函数
C语言程序的框架有两种
1. 一个main() 单框架
2. 一个main()+多个子函数 复合框架
注:
1. 一个源程序文件可由一个或多个函数组成
2. 一个C语言程序可以由一个或多个源程序文件组成
3. C程序执行总是从main()开始, 结束于main(); 可调用其他函数
4. 函数不能嵌套定义, 但可以互相调用, 不能调用main()
函数的分类:
(1)无参函数和有参函数
(2)库函数和用户自定义函数+main()
1. 函数定义
函数返回值类型 函数名(形式参数列表)
{
函数体;
}
说明:
(1)函数体可以没有语句, 但是不能没有花括号, 函数名后必须有一对小括号
(2)定义有参函数是, 形参的定义可以采用传统方式或现代方式两种
传统方式:
int max(x, y)
int x, y; 不能定义形参以外的其他变量
{ }
现代方式:
int max(int x, int y)
{ }
(3)不能在定义函数时在 函数首部后直接跟分号
(4)定义函数时, 必须采用传统方式或现代方式指定形参的格式
(5)函数返回值类型: 两类
void 非void
2. 函数调用: 两种方式
方式1: 非void型
变量名=函数名(实参列表);
方式2: void型
函数名(实参列表);
3. 函数使用
(1)原型声明
方式1: #include<头文件>
方式2: 声明的格式
函数类型 函数名(形成类型1 形参1, 形参类型2 形参2...);
函数类型 函数名(形参类型1, 形参类型2 ...);
口诀:
有头有体无分号 定义
有头有分号 原型声明语句
函数名(实参); 调用
(2)函数调用过程
在进行函数调用时系统将实参值对应的传给形参,是一种值的单向传递
4. 变量三属性: 类型 作用范围 存储类别
4-1. 类型(定义)
4-2. 作用范围
(1)局部变量(内部变量)
定义: 在一个函数内部定义的变量为局部变量
a. 局部变量只能在他所在的函数内有效
b. 在不同的函数中可以出现同名的变量, 他们分别属于不同的变量
c. 复合语句中定义的变量只能在此复合语句中有效
d. 所有形式参数都是局部变量
(2)全局变量(外部变量)
定义: 在函数外部定义的变量为全局变量
a. 全局变量的有效范围是在本文件内从定义该变量的位置开始到本文件结束
b. 全局变量可以在它的有效范围内被每个函数引用
c. 在同一文件中若全局变量与局部变量同名,局部变量屏蔽全局变量
4-3. 存储类别
(1)auto类别变量
a. auto类别变量用完后释放所占用空间
b. 局部变量默认为auto类别, 无初始化时, 初始值为随机值
c. 使用时间短,一般都为auto类别变量
(2)static类别
a. static类别从定义到程序运行结束均占用存储空间
b. 全局变量默认为static类别, 无初始化时, 初值为0
c. static类别变量只进行一次初始化(变量值画(保护)框, 定义用完就划掉)
(3)register类别变量 寄存器变量
a. register类别只能是局部变量才能被说明
b. 一般不能直接使用
(4)extern类别变量
a. extern类别变量可以加大变量的作用范围
b. 两种说明格式
格式1. 定义同时说明类别:
存储类别 类型名 变量名;
格式2. 分别定义 说明
类型名 变量名;
存储类别 变量名;
二 预编译命令
1. 预编译命令 (#)
文件包含(include)
#include<> 在指定目录下搜索库文件
#include" " 范围更大
2. 宏 (#define)
第一种: 无参宏定义
格式:
#define 宏名 宏内容
功能: 用一个制定的标识符(宏名(大写))来代表一串字符(宏内容)
#define PI 3.141592
符号常量
宏名 无语法检查
无类型
注:
(1)宏名我们一般用大写字母表示, 遵守用户自定义标识符命名规则
(2)#define可以在函数外定义, 也可以在函数内定义, 但该命令应该在单独一行上
#undef命令可以提前中止宏名的作用域
(3)在进行宏定义时, 可以引用已经定义的宏名进行层层置换
(4)在进行宏替换时, 必须先替换完所有的宏后再运算, 同时替换过程中不能乱加括号--->原模原样替换, 不要乱加括号, 先替换, 再按优先级计算
第二种: 带参宏定义
格式:
#define 宏名(参数列表) 宏内容
功能: 提供了一种更加灵活的替换方式
#define s(x, y) x*y+2
注:
(1)在定义有参宏时, 参数列表必须用一对小括号括起且小括号和宏名之间不能有空格
(2)对有参宏名进行替换时, 需要现将形参改成相应的实参, 并且注意分清形参和实参的对应关系
第八章 指针
一 指针变量定义
C语言的两种变量:
变量(普通变量)存储内容值
地址变量(指针变量)存储地址值
1. 格式
类型名 *指针变量名;
注:
(1)定义变量(普通变量, 指针变量)都必须在前面有类型名
(2)在定义指针变量时, 指针变量名前的"*"表示现定义的是一个指针类型的变量. 星号并不是指针变量名的一部分, 只是一个标志
(3)指针变量专门来存地址, 禁止将一个整型值直接赋给一个指针变量
2. 指针变量的引用
"&"取地址运算符, 通过&运算符可以取出普通变量的地址
"*"指针运算符, *可以取出指针变量所指向的普通变量的值(间接引用普通变量)
注:
(1)可以通过赋值使一个指针变量“指向”某一普通变量(指针变量=&普通变量)
(2)在C语言中正确的做法是先让指针变量指向一个确定的存储单元后, 再通过该指针变量引用它所指向的存储单元
(3)变量名(普通变量 指针变量)都表示其存储单元内的值
p1=p2; /*p1指向了p2 所指向的单元*/
(4)若指针变量p指向变量a, 即将变量a的地址赋给了指针变量p
如: int a=20, *p=&a;
则有下列结果:
A *p<=>a
B p<=>&a
C &*p〈=〉&a〈=〉 p &与*互逆
D *&a <=> *p<=>a
E (*p)++ a++ 都是给变量a的值加1。
(*p)-- a--
++(*p) ++a ++*p
--(*p) --a --*p
(5)所有的指针变量在内存中分配的字节数相同 sizeof()
int *p int是指针所指向内容的类型
口诀:
地址变量得地址, 得谁地址指向谁
内容变量画房子, 指针变量画指向
有*为内容值, 不是读就是写, "="左边为写,其他都是读
无*为地址, 地址赋值改指向
二 一维数组与指针变量
1. 指向数组元素的指针变量
由于数组元素与普通变量一样, 所以定义指向数组元素的指针变量与定义指向普通变量的指针变量完全一样
2. 指向一维数组的指针变量
注:
(1)在C语言中规定, 数组名代表数组的首地址, 而且是一个地址常量
(2)当指针变量指向数组中某个元素时, 指针变量加1后指向数组的下一个元素, 指针变量减1指向数组的前一个元素
(3)地址三等价 元素四等价
int a[N],*p=a;
p+i a+i &a
*(p+i) *(a+i) a p
当指针变量指向数组时, 下标运算([ ])用于数组也可用于指针变量后
a) *(p+i) *(a+i) a p
b) p++ ++p p+ 1 =1 p=p+1
c) p-- --p p-=1 p=p-1
d) *p++ *(p++) *p-- *(p--) 指针加减
e) *++p *(++p) *--p *(--p)
f) (*p)++ ++(*p) ++*p 内容加减
g) (*p)-- --(*p) --*p
(4)若两个指针变量指向同一个数组, 则这两个指针变量可以进行大小比较
(5)在形参中的数组实际上是一个指针变量, 并不是真正的数组, 因为该“数组名”的值是可以改变的, 而真正的数组名(指针常量)的值是不能改变的。
(6)若形参是数组或指针变量, 则在函数中可以通过该形参改变实参的值
三 **数组与指针变量
若a是一个二维数组,则有:
(1) a+i是行指针, 即指向的是一整行. 若对它加1则指向下一行
(2) *(a+i) 和a一样, 都是一个列指针即指向的是一个元素
(3) *(a+i)+j和a+j一样, 都表示元素a[j]的地址. 即与&a[j]等价。
*(a+i)+j a+j &a[j] 地址三等价
(4) *( (a+i)+j) *(a+j) *(a+i))[j]和a[j]一样, 都表示元素a[j] 元素四等价
1. 指向**数组元素的指针变量
如:
int a[3][4];
int *p=&a[0][3];
则:
p+1指向元素a[1][0]
p+4指向元素a[1][3]
p-2指向元素a[0][1]
常用于取二维数组a元素地址的方式:
&a[j] a+j *(a+i)+j
a[0]<=>&a[0][0]
2. 指向由m个元素组成的一维数组的指针变量
格式:
类型名 (*指针变量名) [m]; m为列数
行指针变量
四 指向字符串的指针变量
字符串常量: C语言对字符串常量是按首地址处理字符串常量
"China" 为地址值
char *p = "China";
五 指向函数的指针变量(函数指针)
函数名与数组名一样, 是起始地址, 而且是一个地址常量
格式:
类型名 (*指针变量名) (形参列表);
注:
(1)“(*指针变量名 )”中的括号不能省, 括号改变了运算符的优先级. 若省略整体则成为一个函数说明, 说明了一个返回的数据类型是指针的函数, 后面的“形参列表”表示指针变量指向的函数所带的参数列表, 可写可不写,但若不写某些编译器不通过
(2) 单独的函数名代表该函数的首地址(函数的入口地址)
(3) 函数的指针变量只能指向函数的入口处(函数的首地址), 不能指向函数中的某条指令. (另对指向函数的指针变量加1是没有意义的)
(4) 给指向函数的指针变量赋值时, 只写函数名即可, 不必写参数
类型名(*指针变量名)( ); 函数指针
类型名 普通变量名; 变量
类型名 数组名[]; 数组
类型名 *指针变量名; 列指针
类型名 函数名( ) 函数定义
{......}
类型名 (*指针变量名)[M]; 行指针
六 返回指针的函数(指针函数)
函数定义:
类型名 函数名(形参)
{ }
返回指针的函数的定义:
类型名 *函数名(形参列表)
{ }
七 指针数组和指向指针的指针变量
1. 指针数组
定义: 若一个数组的所有元素均为指针类型(地址), 则称为指针数组
格式:
类型名 *数组名[常量表达式];
int *s[10];
注:
(1)要注意它与定义指向由m个元素组成的一维数组的指针变量之间的区别
类型名 *数组名[常量表达式];
类型名 (*指针名)[常量表达式m];
(2)它的每个 个 类 元素都是一个指针类型(地址), 即它的每个元素都相当于一个指针变量
2. 指向指针的指针变量
定义: 用来存放指针变量地址的指针变量称为指向指针的指针变量
格式:
基类型名 **指针变量名;
八 空指针
指针变量可以有空值,即指针变量不指向任何变量,不指向任何有用的存储单元。
在系统中已将NULL定义为0,即NULL的值为0
int a,b,c,*p=NULL;
此时p 的值为空指针, 即p不指向任何有用的存储单元. 尽管NULL的值为0, 但我们不能认为p指向了地址为0的存储单元
注:
(1)当一个指针变量的值为空指针时,我们不能引用它所指向的存储单元。
(2)若某指针(地址)的基类型为void型,则有引用时应进行相应的强制类型置换
|
|
|