《2023年C语言精简笔记.pdf》由会员分享,可在线阅读,更多相关《2023年C语言精简笔记.pdf(44页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、C语 言 1、概 述 C 语 言 的 数 据 类 型 有:整 型(int)、实 型(float).字 符 型(char)、数 组 类 型(int)、指 针 类 型(v oid*)、结 构 体 类 型(st rue t)、共 用 体 类 型(uni on)等 C 语 言 允 许 直 接 访 问 物 理 地 址,可 以 直 接 对 硬 件 进 行 操 作,可 以 像 汇 编 语 言 同 样 对 位(bi t)、字 节 和 地 址 进 行 操 作 项 目 语 法 基 本 数 据 类 型 int、float、double、char(没 有 boolean类 型)基 本 语 句 循 环 语 句(do-w
2、hile、while for)、条 件 语 句(if、if-else switch)、got。语 句、空 语 句 注 释/*/和/日 志 输 出 printf(Hello,World!zz);printf(My age is 为 d,27);2、第 一 个 函 数 分 析#in clu d e in t m ain()p r in t f(H ello,World!nH);re tu rn 0;?#include是 C 语 言 的 预 解 决 指 令 之 一,所 谓 预 解 决,就 是 在 编 译 之 前 做 的 解 决,预 解 决 指 令 一 般 以#开 头#include 指 令 后 面
3、会 跟 着 一 个 文 献 名,预 解 决 器 发 现 include指 令 后,就 会 根 据 文 献 名 去 查 找 文 献,并 把 这 个 文 献 的 内 容 包 含 到 当 前 文 献 中。被 包 含 文 献 中 的 文 本 将 替 换 源 文 献 中 的 4 include指 令,就 像 你 把 被 包 含 文 献 中 的 所 有 内 容 拷 贝 到 这 个#include指 令 所 在 的 位 置 同 样 一 个 C 程 序 中 一 定 会 有 一 个 main函 数,也 只 能 有 一 个 main函 数。main函 数 是 整 个 C 程 序 的 入 口。1.在 编 译 前 先
4、 执 行#i n c 1 u d e 指 令,拷 贝 s t d i o.h 的 内 容 到 源 程 序 中 2.编 译 源 程 序,生 成 目 的 文 献 3.链 接 C 语 言 函 数 库,生 成 可 执 行 文 献 4.运 营 可 执 行 文 献,在 屏 幕 上 输 出 H e l l o,W o r ld!3、函 数 C 语 言 的 函 数 可 以 大 约 分 为 3 类:1.主 函 数,也 就 是 m a i n 函 数。每 个 程 序 中 只 能 有 一 个、也 必 须 有 一 个 主 函 数。2.2.开 发 人 员 自 定 义 的 函 数,可 有 可 无,数 目 不 限 3.3.
5、C 语 言 提 供 的 库 函 数 在 标 准 C语 言 中,函 数 的 定 义 顺 序 是 有 讲 究 的,默 认 情 况 下,只 有 后 面 定 义 的 函 数 才 可 以 调 用 前 面 定 义 过 的 函 数 int sum(int a,int b)return a+b;int main。(int c=sum(l,4);return 0;)假 如 调 换 下 s u m 函 数 和 m a in 的 顺 序,在 标 准 的 C 编 译 器 环 境 下 是 不 合 法 的 假 如 想 把 其 他 函 数 的 定 义 写 在 m ain函 数 后 面,并 且 m ain函 数 能 正 常
6、调 用 这 些 函 数,那就 必 须 在 ma i n 函 数 前 面 作 一 下 函 数 的 声 明/只 是 做 个 函 数 声 明,并 不 用 实 现 inr sum(inc a,int b);int main(int c sum(lr 4);return 0;/弹 始 症 义(实 现)int sumfint a,int b)return a+b;)可 以 省 略 参 数 名 称,如 S t sum(int,i n t);在 大 型 的 C 程 序 中,为 了 分 模 块 进 行 开 发,一 般 会 将 函 数 的 声 明 和 定 义(即 实 现)分 别 放 在 2 个 文 献 中,函 数
7、 声 明 放 在.h 头 文 献 中,函 数 定 义 放 在.c源 文 献 中 运 营 环 节 分 析:1 在 编 译 之 前,预 编 译 器 会 将 s u m.h文 献 中 的 内 容 拷 贝 到 ma i n.c 中 2 接 着 编 译 m ain,c 和 s um.c 两 个 源 文 献,生 成 目 的 文 献 m a i n.o b j 和 sum.0 b j,这 2 个 文 献 是 不 能 被 单 独 执 行 的,因 素 很 简 朴:*s u m.o b j中 不 存 在 m a in函 数,肯 定 不 可 以 被 执 行*m a i n.o b j中 虽 然 有 m a i n
8、函 数,但 是 它 在 m a i n 函 数 中 调 用 了 一 个 su m函 数,而 s u m 函 数 的 定 义 却 存 在 于 s u m.o b j中,因 此 m ai n.o b j依 赖 于 sum.obj3 把 m a in.o b j、s um.o b j链 接 在 一 起,生 成 可 执 行 文 献 4 运 营 程 序 在 定 义 函 数 时,函 数 名 后 面 的()中 定 义 的 变 量 称 为 形 式 参 数(形 参);在 调 用 函 数 时 传 入 的 值 称 为 实 际 参 数(实 参)。4、p r i n t f 函 数 scanf 函 数 i n t ag
9、e=17;i n t age;p rin tf(M y age i s%df a g e);sc a n f C,%dwr&age);s c a n f(n%d%d%d,ar&c);3 个 舍 d 之 间 是 用 空 格 隔 开 的,我 们 在 每 输 入 个 整 数 后 必 须 输 入 一 个 分 隔 符,分 隔 符 可 以 是 空 格、t a b、回 乍格 式 符 I5、基 本 数 据 类 型 数 组 sfruct结 构 体 union共 用 体 enum枚 举 irtvoid*整 型 指 针 类 型 基 本 数 据 类 型 浮 点 型 float单 精 度 浮 点 型 double双 精
10、 度 浮 点 型 char构 造 类 型 C 语 言 数 据 类 型 字 符 型 void空 类 型 在 J a v a中,你 声 明 了 个 局 部 变 量 后,假 如 没 有 通 过 初 始 化 赋 值 就 使 用 该 变 量,编 译 器 直 接 报 错 在 C 语 言 中,你 声 明 看 一 个 局 部 变 量 后,没 有 通 过 初 始 化 赋 值 是 可 以 使 用 的 int main()(inr b;printf(%d b);但 这 是 很 危 险 的,不 建 议 这 样 做,b 也 许 会 是 任 意 大 整 数 return 0;假 如 是 全 局 的 int类 型 变 量,
11、系 统 会 默 认 赋 值 为 0c h a r的 取 值 范 围 是:A SC II码 字 符 或 者-1 281 2 7 的 整 数 方 式 1char c=A,;下 面 的 写 法 都 是 错 误 的:/方 式 2char cl=我,;char c=65;char c2=123;char c3=123”;有 以 下 4 种 类 型 修 饰 符:s h o r t 短 型 lo n g 长 型 s ig n e d 有 符 号 型 u n s i g n e d 无 符 号 型 红 色 的 代 表 常 用 的 数 据 类 型 116位 编 译 器 32位 编 译 器 64位 编 译 器 j
12、char 1 1 1void*(指 针 变 量)2 4 8short int 2 2 2unsigned int 2 4 4int 2 4 4float 4 4 4double 8 8 8long 4 4 8unsigned long 4 4 8long long 8 8 86、基 本 语 句 C 语 言 的 基 本 语 句 跟 J av a 中 的 差 不 多,所 以,这 里 只 是 简 朴 地 提 一 下 循 环 语 句(do wh i 1 e、w h ile for)条 件 语 句(i f、if-el s ex s w itc h)g o to语 句 7、基 本 运 算 1、算 术 运
13、算 符+加 法 运 算 符-减 法 运 算 符,或 负 值 运 算 符*乘 法 运 算 符/除 法 运 算 符%模 运 算 符,或 称 取 余 运 算 符,规 定;两 侧 均 为 整 整 2、关 系 运 算 符 小 于 运 算 符 大 于 运 算 符=大 于 等 于 运 算 符=等 于 运 算 符!=不 等 于 运 算 符 3、逻 辑 运 算 符&逻 辑 与 运 算 符 I I 逻 辑 或 运 算 符!逻 辑 非 运 算 符 4、赋 值 运 算 符 1.简 朴 的 赋 值 运 算 符=:i n t a=5;2.复 合 赋 值 运 算 符+=加 赋 值 运 算 符。如 a+=3+1,等 价 于
14、a=a+(3+1)-=减 赋 值 运 算 符。如 a-=3+1,等 价 于 a=a-(3+1)*=乘 赋 值 运 算 符。如 a*=3+1,等 价 于 a=a*(3+1)/=除 赋 值 运 算 符。如 a/=3+1,等 价 于 a=a/(3+1)%=取 余 赋 值 运 算 符。如 a%=3+1,等 价 于 a=a%(3+1)5、自 增 自 减 运 算 符+自 增 运 算 符。如 a+,+a,都 等 价 于 a=a+1 自 减 运 算 符。如 a,a,都 等 价 于 a=a-16、逗 号 运 算 符,逗 号 表 达 式 用 逗 号 运 算 符 连 接 起 来 的 表 达 式 称 为 逗 号 表
15、达 式,它 的 一 般 形 式 为:表 达 式 1,表 达 式 2,,表 达 式 n 逗 号 表 达 式 的 运 算 过 程 是:从 左 到 右 的 顺 序,先 计 算 表 达 式 L 接 着 计 算 表 达 式 2,.最 后 计 算 表 达 式 n*整 个 逗 号 表 达 式 的 值 是 最 后 个 表 达 式 的 值 int a=2;int b=0;int c;c=(+ar a*=2,b=a*5);printf(wc=%dwr c);+a 的 结 果 为 3,a*=2 的 结 果 为 6,b=a*5 的 结 果 为 3 0。因 此,输 出 结 果 为:C=3 07、条 件 运 算 符 条
16、件 表 达 式 其 实 就 是 三 目 运 算 符,一 般 形 式 为:表 达 式 1?表 达 式 2:表 达 式 3in t a=(b 5)?10:9;8、S i z e o f彩 i z e o f可 以 用 来 计 算 一 个 变 量 或 者 一 个 常 量、一 种 数 据 类 型 所 占 的 内 存 字 节 数。siz e o f一 共 有 3 种 形 式 s iz e o f(变 量 常 量)s iz e o f(10);char c=*a;s iz e c f(c);s i ze 0 f 变 量 常 量 sizeo f 10;char c=a;sizeo f c;s i z e o
17、f(数 据 类 型)s i z e c f(f l o a t);注 意,不 可 以 写 成 s iz e o f f 1 o a t;8、数 组 一 维 数 组 定 义 的 形 式 为:类 型 数 组 名 元 素 个 数 i nt a5;只 能 放 在 数 组 名 的 后 面,下 面 的 都 是 错 误 写 法:in t5 a;/错 误 in t b;/错 误 口 里 面 的 个 数 必 须 是 一 个 固 定 值,可 以 是 常 量(比 如 6、8)、常 量 表 达 式(比 如 3+4、5*7)。绝 对 不 能 使 用 变 乱 或 者 变:表 达 式 来 表 达 元 素 个 数,大 多 数
18、 情 况 下 不 要 省 略 元 素 个 数(当 数 组 作 为 函 数 的 形 参 和 数 组 初 始 化 时 除 外)下 面 的 都 是 对 的 写 法:int a 5;整 型 常 量 int bA;/字 符 常 量,其 实 就 是 65i n t c3*4;/整 型 常 量 表 达 式 下 面 的 都 是 能 法 写 法:int a;/没 有 指 定 元 素 个 数,错 误 int i=9;int a i;/用 变 量 做 元 素 个 数,错 误 定 义 数 组 时,系 统 将 按 照 数 组 类 型 和 个 数 分 派 一 段 连 续 的 存 储 空 间 来 存 储 数 组 元 素,毅
19、 组 名 代 表 着 整 个 数 组 的 地 址,鞭 曝 敷 组 的 起 始 地 址 如 i n t a 3 其 实 a 不 算 是 变 量,是 个 常 量,它 代 表 1 爨 鲤 域 k a=&a 0 初 始 化 的 一 般 形 式 是:类 型 数 组 名 元 素 个 数=元 素 1,元 素 2,int a2=8,10;其 实 相 称 于:in t a 2;a0=8;a 1=10;注 意 的 是:C 语 言 中 编 译 器 是 不 会 时 数 组 下 标 越 界 进 行 检 雀 的,所 以 自 己 访 问 数 组 元 素 时 要 小 心元 素 值 列 表 可 以 是 数 组 所 有 元 素
20、的 初 值,也 可 以 是 前 面 部 分 元 素 的 初 值 i n t a 4=2,5;当 数 组 为 整 型 时,初 始 化 未 拟 定 初 值 的 元 素,默 认 为 0,所 以 上 面 的 a 2、a 3 都 为 0当 对 所 有 数 组 元 素 都 赋 初 值 时,可 以 省 略 元 素 个 数 n t a=2,5,7;说 明 数 组 a 的 元 素 个 数 是 3数 组 初 始 化 时 的 赋 值 方 式 只 能 用 于 数 组 的 定 义,定 义 之 后 只 能 一 个 元 素 一 个 元 素 地 赋 值 下 面 的 写 法 是 错 误 的:int a3;也 3=1,2,3);
21、/错 误 a=1,2,3);/错 误 其 实 为 什 么 是 错 误 的 写 法 呢?我 们 可 以 简 要 分 析 一 下。1 第 2 行 的 a 3 代 表 着 访 问 数 组 的 第 4 个 元 素,一 方 面 这 里 已 经 是 数 组 下 标 越 界 了;就 算 没 有 越 界,给 a 3 赋 值 时 也 应 当 赋 一 个 in t 类 型 的 整 数,不 应 当 是(。2 第 3 行 的 a 是 数 组 名,代 表 着 数 组 的 地 址,它 是 个 常 行!给 常 量 赋 值,那 肯 定 错 了!维 数 汇 的 元 索 作 为 函 数 实 参,与 同 类 型 的 简 朴 变 量
22、 作 为 实 参 同 样,是 单 向 的 值 传 递,即 数 组 元 素 的 值 传 给 形 参,形 参 的 改 变 不 影 响 实 参/婕 8 画 数 的 形 参(形 式 参 数)vo id t e s t(in t b)b=9;te s t(a 0);/a 0 是 c e s t数 的 实 参(实 际 参 数)假 如 维 数 组 的 冬 丁 作 为 函 数 实 参,传 递 的 是 整 个 数 组,这 样 形 参 数 组 修 改 时,实 参 数 组 也 同 时 被 修 改 了。形 多 数 组 的 元 素 个 数 可 以 省 略。/娓 8 3 晅 数 的 形 参(形 式 参 数)v o id
23、t e a t(i n t b)/也 可 以 写 i n t b 3 b 0=9;te s t(a);/a是 CR3七 函 数 的 实 参(实 际 参 数)二 维 数 组 定 义 形 式:类 型 数 组 名 行 数 列 数 int a2;共 2 行 3 列,6 个 元 素 a 0,a 1 也 是 数 组,是 一 维 数 组,并 且 a 0,a l 就 是 数 组 名,因 此 a 0 1、a 1 就 代 表 着 这 个 一 维 数 组 的 地 址 按 行 进 行 初 始 化 int a2 3=2,2,3,3,4,5);按 存 储 顺 序 进 行 初 始 化(先 存 放 第 1行,再 存 放 第
24、2 行)int a 2 3=2,2,3,3,4,5;对 部 分 元 素 进 行 初 始 化 i nt a23=2,3,4;int b33=,2,1,2,3);假 如 只 初 始 化 了 部 分 元 素,可 以 省 略 行 数,但 是 不 可 以 省 略 列 数 int a 3=1,2,3,4,5,6);int a 3=1,2,3,3,5,;oint a2=1,2,3,4,5,6;/错 误 写 法 二 维 数 组 会 先 存 放 第 1 行 的 元 素,由 于 不 拟 定 列 数,也 就 是 不 拟 定 第 1 行 要 存 放 多 少 个 元 素,所 以 这 里 会 产 生 很 多 种 情 况,
25、所 以 只 指 定 行 数 是 错 误 的9、字 符 串 在 C 语 言 中,我 们 可 以 用 不 符 数 组 来 存 储 字 符 串。*字 符 串 可 以 看 做 是 一 个 特 殊 的 字 符 数 组,为 了 跟 普 通 的 字 符 数 组 区 分 开 来,应 当 在 字 符 串 的 尾 部 添 加 了 一 个 结 束 标 志,0。o,是 一 个 A S C工 工 码 值 为 0 的 字 符,是 一 个 空 操 作 符,表 达 什 么 也 不 干。所 以 采 用 字 符 数 组 存 放 字 符 串,赋 值 时 应 包 含 结 束 标 志 1 0。文 字 符 串“m j”的 存 储 情 况
26、 如 下(假 设 用 字 符 数 组 c h a r a 来 存 储):注 意 了,尾 部 有 个 0 1 假 如 没 有 这 个 结 束 标 记,说 明 这 个 字 符 数 组 存 储 的 并 不 是 字 符 串 字 符 串 的 初 始 化:char a3=,0;char b(3;b0=a*;b l-b2=0;char c3 mj;char d=char e20=mj;当 我 们 使 用 类 似 第 3 个 的 初 始 化 方 式 时,系 统 会 自 动 在 字 符 串 尾 部 加 上 一 个 0 结 束 符 字 符 串 的 输 出 我 们 可 以 使 用 s t d i o.h 中 两 个
27、 函 数 来 输 出 字 符 串,分 别 是 p r i n t s 和 p u t s 函 数 char a3=1 m,char a=mj;printf(%sf a);puts(a);puts(Imj);告 s 表 达 盼 望 输 出 一 个 字 符 串,因 此 p r i n t f 函 数 会 从 b 的 首 地 址 开 始 按 顺 序 输 出 字 符,一 直 到 0 字 符 为 止,由 于 0 是 字 符 串 的 结 束 标 记。同 样 p u t s 函 数 会 从 a 的 首 地 址 开 始 输 出 字 符,一 直 到 0 字 符 为 止。所 以,假 如 想 要 创 建 一 个 字
28、 符 串,记 得 加 上 结 束 符 0,不 然 后 果 很 严 重,会 访 问 到 一 些 垃 圾 数 据。p u t s 函 数 输 出 一 个 字 符 串 后 会 自 动 换 行,p u t s 函 数 一 次 只 能 输 出 一 个 字 符 串,p r i n t f 函 数 则 可 以 同 时 输 出 多 个 字 符 串字 符 串 的 输 入 我 们 可 以 使 用 S t d i o.h 中 有 2 个 函 数 可 以 用 来 接 受 用 户 输 入 的 字 符 串,分 别 是 s c a n f和 ge tchar a10;char a10;s c a n f a);gets(a
29、);g e t s 跟 s c a n f 同 样,会 从 a 的 首 地 址 开 始 存 放 用 户 输 入 的 字 符,存 放 完 毕 后,系 统 会 自 动 在 尾 部 加 上 一 个 结 束 标 记 0 O*g e t s 一 次 只 能 读 取 一 个 字 符 串,s c a n f则 可 以 同 时 读 取 多 个 字 符 串*g e t s 可 以 读 入 包 含 空 格、t a b 的 字 符 串,直 到 碰 到 回 车 为 止;s c a n f 不 能 用 来 读 取 空 格、t a b6 字 符 串 数 组:char names2 10=(J r 0 r 1 J,1i1,
30、1m*r 0*);char names22 10=rJay-,-Jim);,char names3210=Jay,Jim;10、字 符 与 字 符 串 常 用 解 决 函 数 字 符 解 决 函 数 字 符 输 出 putch a r():op u tc h ar(6 5);/Aputc h ar(5 A 7);/Aoi n t a=6 5;叩 u t c ha r(a);/A上 面 的 3 种 用 法,输 出 的 都 是 大 写 字 母 A。*P utc h a r 一 次 只 能 输 出 一 个 字 符,而 p r intf可 以 同 时 输 出 多 个 字 符 print f(z,%c%
31、c%c,A,B,a);。字 符 输 入 g e tchar 0:char c;c=g etchar();g e tc h a r 会 将 用 户 输 入 的 字 符 赋 值 给 变 量 c。*get c h a r 函 数 可 以 读 入 个 格,T AB,直 到 碰 到 回 车 为 止。s canf则 不 能 读 入 空 格 和 TA B。*g e tch a r 一 次 只 能 读 入 一 个 字 符。scanf则 可 以 同 时 接 受 多 个 字 符。*g etchar还 能 读 入 回 车 换 行 符,这 时 候 你 要 敲 2 次 回 车 健。第 1 次 敲 的 回 车 换 行 符
32、 被 ge t char读 入,第 2 次 敲 的 回 车 键 代 表 输 入 结 束。字 符 串 解 决 函 数:l.strlen 函 数 St r l e n 函 数 会 从 s 2 的 首 地 址 开 始 计 算 字 符 串 的 字 符 个 数,直 到 碰 到 空 字 符 0 为 止,不 涉 及 0int size strleni-mj);/长 度 为 2char sl=Imj;int sizel=strlen(sl);/长 度 为 3char a2=m*,q I,XO1,*1 m,jr 0,;int 9ize2=3trlen(s2);/长 度 为 22.strep y 函 数 char
33、 s10;strcpy(a,Imj);s t r c p y 函 数 会 将 右 边 的“lmj”字 符 串 拷 贝 到 字 符 数 组 s 中。从 s的 首 地 址 开 始,逐 个 字 符 拷 贝,直 到 拷 贝 到 0 为 止。当 然,在 s 的 尾 部 肯 定 会 保 存 一 个 0。*假 设 右 边 的 字 符 串 中 有 好 几 个 0,strepy函 数 只 会 拷 贝 第 1 个 0 之 前 的 内 容,后 面 的 内 容 不 拷 贝 char 310;char c=Cm,1 0 frf*0);strcpy(s,c);最 后 字 符 串 s 中 的 内 容 为:mj3.strca
34、t 函 数 cha r s l 3 0=LOVE;strc a t(s 1,0C);strcat函 数 会 将 右 边 的 OC字 符 串 拼 接 到 si的 尾 部,最 后 s 1的 内 容 就 变 成 了 LOVEOCS1连 接 前 L 0 V E 0s i 连 接 后 L 0 V E 0 C 0strcat函 数 会 从 si的 第 1个 0字 符 开 始 连 接 字 符 串,s 1的 第 1 个 0字 符 会 被 右 边 的 字 符 串 覆 盖,连 接 完 毕 后 在 s i 的 尾 部 保 存 一 个 0*注 意 下 面 的 情 况 cha r si 3 0=L,m,,j,0,,L,
35、o,v e 0;s treat(si,OC);p r intf(%s,si);第 1 行 初 始 化 的 s 1有 2 个 0,通 过 第 2 行 的 strcat函 数 后,输 出 结 果:“l j O C4.s t rem p 函 数*这 个 函 数 可 以 用 来 比 较 2 个 字 符 串 的 大 小*调 用 形 式 为:$1:1 6(字 符 串 1,字 符 串 2)*两 个 字 符 串 从 左 至 右 逐 个 字 符 比 较(按 照 字 符 的 ASC工 工 码 值 的 大 小),直 到 字 符 不 相 同 或 者 碰 见 0为 止。假 如 所 有 字 符 都 相 同,则 返 回 值
36、 为 0。假 如 不 相 同,则 返 回 两 个 字 符 串 中 第 一 个 不 相 同 的 字 符 ASC I I 码 值 的 差。即 字 符 串 1 大 于 字 符 串 2 时 函 数 返 回 值 为 正,否 则 为 负。c har si=abc;ch a r s 2=n ab c n;char s3=aBc;char s4=c c b;opr in t f(z,%d,%d,%d,s t r c mp(sl,s 2),strcmp(s 1,s3),st rcmp(s 1,s4);输 出 结 果:%32,-2s 1 和$2相 同,所 以 返 回 0s 1 和 s 3 是 第 2 个 字 符
37、不 相 同,b 的 ASC工 工 码 值 是 98,B 的 ASC工 工 码 值 是 6 6,b-B32,所 以 返 回 32s 1和 s 4 是 第 1 个 字 符 就 不 相 同,a 的 ASC I I 码 值 是 97,c 的 ASCI I 码 值 是 99,ac=-2,所 以 返 回-21 1、指 针 通 过 变 量 名 来 直 接 引 用 变 量,然 后 进 行 赋 值:char a;a=1 0;通 过 变 量 名 引 用 变 量,由 系 统 自 动 完 毕 变 量 名 和 其 存 储 地 址 之 间 的 转 换,称 为 变 量 的“直 接 引 用”方 式 变 量 _J 地 址 存
38、储 的 内 容 a I ffcl 0000 1010直 接 引 用 是 直 接 通 过 变 量 名 来 读 写 变 量 C 语 言 中 尚 有 一 种“间 接 引 用”的 方 式(以 变 量 a 为 例):方 面 将 变 量 a 的 地 址 存 放 在 另 一 个 变 量 中,比 如 存 放 在 变 量 b 中,然 后 通 来 间 接 引 用 变 量 a,间 接 读 写 变 量 a 的 值。这 就 是 间 接 引 用。假 如 程 序 通 过“间 接 引 用”的 方 式 来 修 改 a 的 值,可 以 这 样 做:先 根 据 变 量 名 b 获 取 变 量 b 的 地 址 f f c 2,取 出
39、 变 量 b 中 存 储 的 内 容 f f c l,也 就 是 变 量 a 的 地 址,再 根 据 变 量 a 的 地 址 f f c 1找 到 a 的 存 储 空 间,然 后 修 改 里 面 的 数 据。总 结 一 句:用 来 存 放 变 最 地 址 的 变 量,就 称 为 指 针 变 量。在 上 面 的 情 况 下,变 量 b 就 是 个 指 针 变 量”,我 们 可 以 说 指 针 变 量 b 指 向 变 量 a。指 针 的 定 义 般 形 式:类 名 标 记 符*指 针 变 量 名;i n t*p;of 1 o a t*q;。指 针 的 初 始 化 1.先 定 义 后 初 始 化/定
40、 义 类 型 的 变 里 aint a=10;/定 义 一 个 指 针 变 里 Pint*p;/将 变 里 有)地 址 哦 值 给 指 针 变 里 A 所 以 指 针 变 里 P指 向 变 里 ap=&a;2.定 义 时 同 时 初 始 化/定 义 in或 型 的 变 里 aint a=10;/定 义 一 个 指 针 变 里 p/并 将 变 里 遍)地 址 喊 值 给 指 针 变 里 p,所 以 指 针 变 里 言 后 向 变 里 aint*p=&a;指 针 变 量 是 用 来 存 放 变 量 地 址 的,不 要 给 它 随 意 赋 值 一 个 常 数。下 面 的 写 法 是 错 误 的 in
41、t*p;P=200;/这 是 错 误 的 3.指 针 运 算 符*1.给 指 针 指 向 的 变 量 赋 值 指 针 变 量 时 旨 向 变 里 achar*p=皿/通 过 指 针 变 里 P间 接 修 改 变 第 a的 值*p=9;2.取 出 指 针 所 指 向 变 量 的 值 char value=*p;printf(取 出 a的 值:%dw,value);4.指 针 用 途 写 一 个 函 数 sw a p,接 受 2个 整 型 参 数,功 能 是 互 换 两 个 实 参 的 值。void swap(char*vl,char*v2)/中 间 变 里 char temp;/取 出 v l指
42、 向 的 变 量 的 值 temp=*vl;/取 出 流 指 向 的 变 里 的 值,然 后 哦 值 给 v l指 向 的 变 里*vl=*v2;/哦 值 给 v2指 向 的 变 里*v2=teirp;in t main()(char a=10,b=9;princ(更 换 前:a=%dr b=%dn0,a,b);swap(&ar&b);p rin c f(“更 换 后:a=%dr b-%df a,b);re tu rn 0;默 认 情 况 下,一 个 函 数 只 能 有 一 个 返 回 值,有 了 指 针,我 们 可 以 实 现 函 数 有“多 返 回 值”计 算 2个 整 型 的 和 与 差
43、 in t sumAndMinus(in t v l,in t v2,in t*minus)计 算 差,并 赋 值 给 指 针 指 向 的 变 里 minus=v l-v2;/定 义 2个 变 里 来 分 别 接 收 和 与 差 in t sum,minus;/计 算 和,并 返 回 和 retu rn v l+v2;调 用 函 数 sum=aumAndMinus(a,b,二 minus);每 个 指 针 变 量 所 占 用 的 内 存 空 间 是 同 样 的,并 且 存 储 的 都 是 地 址,为 什 么 指 针 变 量 还 耍 分 类 型?由 于 当 运 用*p 获 取 变 量 C 的 值
44、 时,由 于 指 针 P 会 根 据 变 量 C 的 类 型 来 取 多 少 字 节 的 数 据。5.指 针 与 数 组 P 是 指 针,a 是 一 个 数 组 1 假 如 p 指 向 了 一 个 数 组 元 素,则 p+1 表 达 指 向 数 组 该 元 素 的 下 一 个 元 素。比 如,假 设 p=&a 0,则 p+1 表 达 a 1 的 地 址 2 对 于 不 同 类 型 的 数 组 元 素,P 值 的 改 变 是 不 同 的。假 如 数 组 元 素 为 i n t 类 型,p+1 代 表 着 P 的 值 加 上 2(1 6 位 编 译 器 环 境 下)3 假 如 p 的 初 值 是&
45、a 0,那 么 p+i和 a+i 都 可 以 表 达 元 素 a i 的 地 址,它 们 都 指 向 数 组 的 第 i 个 元 素。a 代 表 数 组 首 地 址,a+i 也 是 地 址,它 的 计 算 方 法 与 p+i相 同*(p+i)和*(a+i)都 表 达 数 组 元 素 a i 虽 然 p+i和 a+i 都 指 向 数 组 的 第 i 个 元 素,但 两 者 使 用 时 还 是 有 区 别 的。由 于 作 为 指 针 变 量 的 P 可 以 改 变 自 身 值,如 P+,使 P 的 值 自 增。而 数 组 名 a 是 一 个 代 表 数 组 首 地 址 的 常 量,它 的 值 是
46、不 能 改 变 的,即 a+是 不 合 法 的,数 组 名 a 是 个 常 情:!不 能 进 行 赋 值 运 算!4 引 用 一 个 数 组 元 素 可 以 有 两 种 方 法:下 标 法:如 a L i 指 针 法:如*p+i)或*(a+i)6.指 针、数 组 和 函 数 函 数 的 实 参 和 形 参 都 可 以 分 别 使 用 数 组 或 指 针。这 样 就 有 4 种 情 况:实 参 数 组 名 数 组 名 指 针 指 针 形 参 数 组 指 针 数 组 指 针 也 就 是 说,假 如 一 个 函 数 的 形 参 类 型 是 一 个 数 组,调 用 函 数 时,你 可 以 传 入 数
47、组 名 或 者 指 针 变 量;假 如 个 函 数 的 形 参 类 型 是 一 个 指 针 变 量,调 用 函 数 时,你 可 以 传 入 数 组 名 或 者 指 针 变 量。7.指 针 与 字 符 串 用 指 针 遍 历 字 符 串 的 所 有 字 符/定 义 一 个 指 针 pchar*p;/定 义 一 个 数 组 s存 放 字 符 串 char s=mj;/指 针 F指 向 字 符 串 的 首 字 符 P=S;/或 者 P=&30;for(;*p!=*0*;p+)printf(%c nr*p);字 符 串 解 决 函 数 的 参 数 都 是 指 向 字 符 变 量 的 指 针 类 型,因
48、 此 可 以 传 入 指 针 变 量 或 者 数 组 名。size_t strlen(const char*);char*strcpy(char*,const char*);/字 符 串 拷 贝 函 数 char*s treat(char*,const char*);/字 符 串 拼 接 函 数 int str crop(const char*,const char*);/字 符 串 比 较 函 数 我 们 也 可 以 直 接 用 指 针 指 向 一 个 字 符 串,省 略 定 义 字 符 数 组 这 个 环 节/定 义 一 个 字 符 串,用 指 针 耳 指 向 这 个 字 符 串 char
49、*s;char*s=wmjrt;s=mj;但 是 要 注 意:char a=Imj;定 义 的 是 一 个 字 符 串 变 量!cha r*p2=j;定 义 的 是 一 个 字 符 串 常 量!下 面 的 做 法 也 是 错 误 的:char*3=mj;*B=like;由 于 s 指 向 的 一 个 常 量 字 符 串,不 允 许 修 改 它 内 部 的 字 符 字 符 数 组 也 是 不 允 才 这 样 做,下 面 的 做 法 是 错 法 的:char 3 10;3=叫;由 于 S 是 数 组 第 一 个 元 素 的 地 址,但 是 可 以*S 二 L;修 改 字 符 串 变 量 内 部 字
50、 8.函 数 指 针 函 数 作 为 一 段 程 序,在 内 存 中 也 要 占 据 部 分 存 储 空 间,它 也 有 一 个 起 始 地 址,即 函 数 的 入 口 地 批 其 中,函 数 名 就 代 表 着 函 数 的 地 址。指 向 函 数 的 指 针 的 定 义 的 般 形 式:函 数 的 返 回 值 类 型(*指 针 变 量 名)(形 式 参 数 1,形 式 参 数 2,.);注 意:形 式 参 数 的 变 量 名 可 以 省 略,甚 至 整 个 形 式 参 数 列 表 都 可 以 省 略 int sum(int a,int b)return a+b;)int main()(/定