没有幻灯片标题

Similar documents
C++ 程式設計

chap07.key

Microsoft PowerPoint - 5. 指针Pointers.ppt [兼容模式]

《C语言程序设计》第2版教材习题参考答案

Generated by Unregistered Batch DOC TO PDF Converter , please register! 浙江大学 C 程序设计及实验 试题卷 学年春季学期考试时间 : 2003 年 6 月 20 日上午 8:3

《C语言程序设计》教材习题参考答案

网C试题(08上).doc

C/C++ - 函数

状 态, 使 人 类 社 会 难 以 正 确 认 识 评 级 这 一 信 用 经 济 的 内 在 规 律, 难 以 真 正 总 结 西 方 错 误 评 级 的 教 训, 难 以 让 评 级 有 效 服 务 于 人 类 信 用 经 济 实 践 如 果 我 们 还 不 能 在 信 用 评 级 思 想 领

第五讲 数组 一维数组 二维数组 数组作为函数参数

<4D F736F F D C4EAD6A4C8AFCAD0B3A1C6C0BCB6BDE1B9FBB7D6CEF6B1A8B8E62E646F6378>

Microsoft PowerPoint - 4. 数组和字符串Arrays and Strings.ppt [兼容模式]

试卷代号 :1075 座位号 rn 国家开放大学 ( 中央广播电视大学 )2015 年秋季学期 " 开放本科 " 期末考试 c+ 十语言程序设计试题 2016 年 1 月 t 问一 Urr-f 斗 士 1 1. 下面的保留字 ( ) 不能作为函数的返回类型 A. void B. int C. new

72075(BOC A Share)_入cover同back cover.indb

试卷代号 ~1075 座位号 E 口 国家开放大学 ( 中央广播电视大学 )20]5 年秋季学期 " 开放本科 " 期末考试 C 十十语言程序设计 试题 同二二十斗 2016 年 1 月 巴叫一 1. 下面的保留字 ( ) 不能作为函数的返回类型 A. void B. int C. new D. l

2013 C 1 # include <stdio.h> 2 int main ( void ) 3 { 4 int cases, a, b, i; 5 scanf ("%d", & cases ); 6 for (i = 0;i < cases ;i ++) 7 { 8 scanf ("%d %d

C 1 # include <stdio.h> 2 int main ( void ) { 4 int cases, i; 5 long long a, b; 6 scanf ("%d", & cases ); 7 for (i = 0;i < cases ;i ++) 8 { 9

Microsoft Word - 把时间当作朋友(2011第3版)3.0.b.06.doc

《C语言程序设计》教材习题参考答案

C/C++语言 - 运算符、表达式和语句

untitled

2015年计算机二级(C语言)模拟试题及答案(四)

人力资源服务机构等级划分与评定.doc

新 疆 交 通 建 设 集 团 股 份 有 限 公 司 首 次 公 开 发 行 股 票 辅 导 工 作 进 展 报 告 新 疆 交 通 建 设 集 团 股 份 有 限 公 司 ( 以 下 简 称 新 疆 交 建 发 行 人 或 公 司 ) 拟 申 请 首 次 公 开 发 行 股 票 并 上 市, 公

释 义 在 本 转 让 说 明 书 中, 除 非 文 中 另 有 所 指, 下 列 词 语 具 有 如 下 含 义 : 我 国 / 中 国 指 中 华 人 民 共 和 国 公 司 本 公 司 转 让 方 本 产 品 指 指 临 沂 市 经 济 区 经 开 小 额 贷 款 股 份 有 限 公 司 鲁

第4章 栈和队列

AAA (i) (ii) 19

目 录 第 一 部 分 前 言...1 第 二 部 分 释 义...3 第 三 部 分 基 金 的 基 本 情 况...9 第 四 部 分 基 金 份 额 的 发 售...12 第 五 部 分 基 金 备 案...14 第 六 部 分 基 金 份 额 的 申 购 与 赎 回...15 第 七 部 分

第3章.doc

untitled

一 关于内存 数据存储 变量分类 局部变量 全局变量 静态变量 请看下面代码, 分析变量类型? int pi = 3; int Area(int r, int *sum) { int b; static int c =0; b = pi * r * r; c += b; *sum = c; retu

(1) C

C C

c_cpp

Microsoft Word 生物02.doc

碩命題橫式

untitled


C++ 程序设计 告别 OJ1 - 参考答案 MASTER 2019 年 5 月 3 日 1

Microsoft Word - 《C语言开发入门》课程教学大纲-2.doc

, ; ;,,,, ; 6000, ; ; 5000, 8350 ;, 3000,, 15 20, 10, 6000,,, 35,,,,,,,,?

untitled

新版 明解C言語入門編

新・明解C言語入門編『索引』

桂教高教〔2003〕117号(关于公布2003年“新世纪广西高等教育教学改革工程”重点资助项目暨新增立项项目的通知)

C/C++ - 文件IO

Microsoft Word 年9月二级C真卷.doc

C/C++语言 - C/C++数据

C

第一章

第 一 信 封 详 细 评 审 第 二 信 封 初 步 评 审 (5) 投 标 人 以 联 合 体 形 式 投 标 时, 联 合 体 协 议 书 满 足 招 标 文 件 的 要 求 : 投 标 人 按 照 招 标 文 件 提 供 的 格 式 签 订 了 联 合 体 协 议 书, 并

untitled

<313034A4BDB67DA4C0B56FBA5DB3E65FBD64A5BB2E786C7378>

公共圖書館利用教育方案規劃之研究


<4D F736F F D B0EABB79A4E5B8D5C344BBBCB065AAA9>


康體藝術

% 14A.76(1) A CMG CMG % 5% A % 5% A 14A.53 (i) (ii) (iii) (iv) 2

Microsoft PowerPoint - C语言课件-9-结构体.pptx


書本介紹

技能竞赛C试题

PowerPoint 演示文稿

Microsoft Word - 永政发〔2016〕48号.doc

南网资审文件范本

2. (1) (2) (3) 200 (4) (5) 3-10 (6) 90%

2013 年 大 陸 書 市 觀 察 2013 年, 新 笑 傲 江 湖 也 引 起 熱 烈 討 論, 首 播 當 晚 已 居 黃 金 檔 電 視 劇 收 視 冠 軍, 進 而 帶 動 了 該 作 品 的 圖 書 銷 量, 之 後 隋 唐 英 雄 傳 精 忠 嶽 飛 等 也 紛 紛 改 編 成 電

<4D F736F F D20B5DA313139BDECB9E3BDBBBBE1B2CED5B9CAD6B2E1B7FECEF1D6B8C4CF D6F6B2E646F63>

新・解きながら学ぶC言語

Microsoft PowerPoint - 3. 函数Functionl.ppt [兼容模式]

目 录 第 一 部 分 档 案 局 概 况 一 主 要 职 责 二 部 门 决 算 单 位 构 成 第 二 部 分 档 案 局 2016 年 度 部 门 预 算 表 一 2016 年 度 市 级 部 门 收 支 预 算 总 表 二 2016 年 度 市 级 部 门 支 出 预 算 表 三 2016

2015 年 度 收 入 支 出 决 算 总 表 单 位 名 称 : 北 京 市 朝 阳 区 卫 生 局 单 位 : 万 元 收 入 支 出 项 目 决 算 数 项 目 ( 按 功 能 分 类 ) 决 算 数 一 财 政 拨 款 一 一 般 公 共 服 务 支 出 二


序 1995 年 我 走 进 了 朝 阳 区 将 台 乡 五 保 老 人 院, 如 今 17 年 后, 十 分 欣 喜 有 机 会 为 这 本 流 金 岁 月 小 集 作 序 在 多 年 陪 伴 孤 单 老 人 的 过 程 中, 我 深 深 地 体 会 到 每 位 老 人 的 生 命 里 其 实 都


工 造 价 15 邗 江 南 路 建 设 工 一 标 市 政 公 用 6000 中 机 环 建 集 团 有 限 公 胡 美 娟 16 邗 江 南 路 建 设 工 二 标 市 政 公 用 品 尊 国 际 花 园 1# 2# 3# 4# 7# 9# 10# 11# 楼 地 库 C 区 工

第一篇 建置区划


untitled


31 121

ǎà

78 云 芝 79 五 加 皮 80 五 味 子 81 五 倍 子 82 化 橘 红 83 升 麻 84 天 山 雪 莲 85 天 仙 子 86 天 仙 藤 87 天 冬 88 天 花 粉 89 天 竺 黄 90 天 南 星 91 天 麻 92 天 然 冰 片 ( 右 旋 龙 脑 ) 93 天 葵

43081.indb

一 天 吃 两 顿, 从 不 例 外 我 上 班 就 是 找 一 个 网 吧 上 网 上 网 的 内 容 很 杂, 看 新 闻, 逛 论 坛, 或 者 打 打 小 游 戏 如 果 没 钱 上 网, 我 会 独 自 一 个 人 到 一 个 偏 僻 的 地 方, 静 静 地 坐 着 发 呆 这 也 是

2015 年 水 利 建 设 市 场 主 体 信 用 评 价 结 果 一 勘 察 单 位 ( 共 92 家 ) AAA 级 (48 家 ) 1 中 国 电 建 集 团 北 京 勘 测 设 计 研 究 院 有 限 公 司 2 北 京 市 水 利 规 划 设 计 研 究 院 3 中 水 北 方 勘 测

2016 年 地 质 工 程 系 教 学 工 作 安 排 2016 学 年 我 系 将 在 总 结 过 去 工 作 的 基 础 上, 结 合 今 年 学 院 以 抓 质 量 强 内 涵 促 改 革 调 结 构 建 品 牌 细 管 理 重 过 程 为 宗 旨, 以 规 范 管 理 深 化 内 涵 为

<4D F736F F D203136BCADBBD8D2E4D3EBD1D0BEBF2E646F63>

萧山中学课程建设方案.doc


Microsoft Word - 9pinggb_A4.doc

Microsoft Word - 9pinggb_A4-f4.doc

理 论 探 索 事 业 单 位 改 革 的 五 点 思 考 余 路 [ 摘 要 ] 事 业 单 位 改 革 是 中 国 改 革 的 重 要 环 节, 其 影 响 力 和 难 度 不 亚 于 国 有 企 业 改 革 本 文 着 重 围 绕 推 进 事 业 单 位 改 革 应 考 虑 的 五 个 方 面

日 本 位 于 亚 洲 东 部, 太 平 洋 西 北 角, 是 我 国 东 方 的 一 个 岛 国 在 洪 积 世 ( 注 1) 的 大 部 分 时 期 内, 日 本 与 大 陆 相 连 大 约 在 洪 积 世 晚 期 至 冲 积 世 ( 注 2) 初 期, 日 本 各 地 发 生 海 进, 出 现

2深化教育教学改革、创新人才培养模式


Microsoft Word - 9pinggb_let.doc

实 习 上 下 点 表 格 解 释 和 相 关 纪 律 要 求 : 1 表 格 中 所 有 名 词 都 为 简 称, 包 括 医 院 名 称 四 年 级 五 年 级 各 专 业 名 称 等 所 有 时 间 都 为 学 生 装 好 行 李 出 发 时 间, 请 提 前 0 分 钟 将 行 李 运 到

3 基 金 杠 杆 从 分 级 基 金 的 概 念, 我 们 知 道 了 分 级 基 金 的 A 份 额 是 每 年 获 得 固 定 收 益 的 稳 健 份 额,B 份 额 是 具 有 杠 杆 效 应 的 激 进 份 额 分 级 基 金 中 的 杠 杆 一 般 有 三 类 : 份 额 杠 杆 =(A

Transcription:

指针作为函数参数 : 原因 : 1 需要修改一个或多个值,( 用 return 语句不能解决问题 ) 2 执行效率的角度

使用方法 : 在函数原型以及函数首部中需要声明能够接受指针值的形参, 具体的写法为 : 数据类型 * 形参名 如果有多个指针型形参, 则用逗号分隔, 例如 : void swap(int *p1, int *p2) 它说明了形参 p1 p2 是指向整型变量的指针

在函数调用时, 只需要用指针变量名作为实参即可 例如有变量声明 : int * n1, *n2;. swap(n1, n2);/* 函数调用 */

在 C 语言中, 实参与形参之间的结合是单向的 值传递 方式 指针变量作函数参数也必须遵循这一规则 调用函数不能改变实参指针变量的值, 但可以改变实参变量所指向的变量的值

#include <stdio.h> int cubebyvalue(int); main() int number=5; printf("the original value of number is %d\n",number); number=cubebyvalue(number); printf("the new value of number is %d\n",number); return 0; int cubebyvalue(int n) int k= n*n*n; n=10; return k;

Main 调用 cubebyvalue 之前 Main() Number=5 Int cubebyvalue(int n) int number=5; return n*n*n; number=cubebyvalue(number); N 无确定值 Main 调用 cubebyvalue 之后 Main() Number=5 Int cubebyvalue(int n) int number=5; return n*n*n; number=cubebyvalue(number); N=5

cubebyvalue 计算了参数 n 的立方之后 Main() Number=5 Int cubebyvalue(int n) int number=5; return n*n*n;//125 number=cubebyvalue(number); N=5 从 cubebyvalue 返回到 main 之后 Main() Number=5 Int cubebyvalue(int n) int number=5; return n*n*n; number=cubebyvalue(number);125 n 无确定值

Main 完成给 number 赋值之后 Main() Number=125 Int cubebyvalue(int n) int number=5; return n*n*n; number=cubebyvalue(number); n 无确定值

#include <stdio.h> void cubebyreference(int *); main() int number=5; printf("the original value of number is %d\n",number); cubebyreference(&number); printf("the new value of number is %d\n",number); return 0; void cubebyreference(int * n) Int k; *n= *n * *n * *n; n=&k;

Main 调用 cubebyreference 之前 Main() Number=5 Int cubebyreference(int * n) int number=5; *n= *n * *n * *n; cubebyreference(&number); N 无确定值 Main 调用 cubebyreference 之后以及在计算 *n 的立方之前 Main() Number=5 Int cubebyreference(int * n) int number=5; *n= *n * *n * *n; cubebyreference(&number); N

Main 调用 cubebyreference 之后以及在计算 *n 的立方之后 Main() Number=125 Int cubebyreference(int * n) int number=5; *n= *n * *n * *n; cubebyreference(&number); N Main 调用 cubebyvalue 之后以及从 cubebyreference 返回 Main() Number=125 Int cubebyvalue(int * n) int number=5; *n= *n * *n * *n; cubebyreference(&number); N 无确定值

#include <stdio.h> void swap(int *,int *); main() int a,b; int *aptr, *bptr; printf("please input two integers:\n"); scanf("%d%d",&a,&b); aptr=&a; bptr=&b; if (a<b) swap(aptr,bptr); printf("\n%d,%d\n",*aptr,*bptr); return 0; void swap(int * n1,int *n2) int p; p=*n1; *n1=*n2; *n2=p;

void swap(int * n1,int *n2) int *p; *p=*n1; *n1=*n2; *n2=*p; void swap(int *n1,int *n2) int *p; p=n1; n1=n2; n2=p;

#include <stdio.h> void swap(int,int); main() int a,b; int *aptr, *bptr; printf("please input two integers:\n"); scanf("%d%d",&a,&b); aptr=&a; bptr=&b; if (a<b) swap(a,b); printf("\n%d,%d\n",*aptr,*bptr); return 0; void swap(int n1,int n2) int p; p=n1; n1=n2; n2=p;

a a[0] 多维数组的地址 a[0][0] a[0][1] a[0][2] a[0][3] a a[0][0] a[0][1] a[0] a[1] a[2] a[1][0] a[1][1] a[1][2] a[1][3] a[2][0] a[2][1] a[2][2] a[2][3] 二维数组的地址 :a, 二维数组行的地址 :&a[i],a+i 二维数组元素的地址 : &a[0][0],a[0],a[1],a[2] *(a+i)+j &a[i][j],a[i]+j 二维数组元素值 :a[i][j],*(a[i]+j) *(*(a+i)+j) a[0][2] a[0][3] a[1][0] a[1][1] a[1][2] a[1][3] a[2][0] a[2][1] a[2][2] a[2][3] a[0][0] a[1] a[2]

a[0]-------a00,a01,a02,a03 a[1]-------a10,a11,a12,a13 a[2]-------a20,a21,a22,a23 a[0]+0, a[0] +1, a[0]+2, a[0] +3==&a[0][3] a[1]+0, a[1] +1, a[1]+2, a[1] +3==&a[1][3] a[2]+0, a[2] +1, a[2]+2, a[2] +3==&a[2][3] *(a+2)+0, *(a+2) +1, *(a+2) +2, *(a+2) +3==&a[2][3] a[0],a[1],a[2] *a *(a+1) *(a+2)

int a[3]; a[0],a[1],a[2] a a+1 a+2 *a *(a+1) *(a+2) int *p, (*p1)[4]; P+1; p1+1; p=a;

1 含义 : 一个指针变量可以指向二维数组的元素, 而二维数组的元素也可以表示成指针的形式. 2 分析以下的程序 int aa[3][3]=2,4,6; main() int i,*p=&aa[0][0]; for(i=0;i<2;i++) if(i==0) aa[i][i]=*p+1; else ++p; printf( %d,,*p); 运行结果为 :3,0 指向二维数组元素的指针

分析以下的程序 main() int a[3][4]= 1,3,5,7,9,11,13,15,17,19,21,23; int *p; for(p=*(a+0),a[0],&a[0][0];p<a[0]+12;p++) if((p-a[0])%4==0) printf(( \n ); printf( %4d,*p);

1 含义: 指针所指的是包含 m 个元素的一维数组 p,a 也即指向二维数组行的指针 2 表示方法 : 数据类型 (* 指针变量 )[ 数组元素个数 ] 3 引用方法 : 分析以下的程序 main() static int a[3][4]= 1,3,4,7,9,,11,13,15,17,19,21,23; int (*p)[4]=a,i,j,k=0; for(i=0;i<3;i++) for(j=0;j<4;j++) k=k+*(*(p+i)+j); printf( %d\n,k); 指向二维数组行的指针 p+1 p+2 a[0][0] a[0][1] a[0][2] a[0][3] a[1][0] a[1][1] a[1][2] a[1][3] a[2][0] a[2][1] a[2][2] a[2][3] a[0] a[1] a[2]

对 *(*(p+i)+j) 的理解 : p+i 相当于 a 数组的第 i 行的首地址 ; *(p+i) 相当于 a 数组的第 i 行第 0 个元素的地址 ; 等价于 a[i]; *(p+i)+j 相当于 a 数组第 i 行第 j 列的元素的地址 ; 等价于 &a[i][j] 等价于 p[i]+j 等价于 a[i]+j *(*(p+i)+j) 等价于 a[i][j]

例 exp7_18: 分析以下的程序 main() int a[2][3],(*p)[3]; int k=0,j; p=a; for(;k<2;k++) for(j=0;j<3;j++) *(p[k]+j)=(k+1)*(j+1); printf( %d\n,*(p[1]+2)); 运行结果为 :6

小结 : 表示形式 a a[0],*(a+0),*a a+1 a[1],*(a+1) a[1]+2,*(a+1)+2 &a[1][2] *(a[1]+2), *(*(a+1)+2), a[1][2] 含义二维数组名, 数组首地址第 0 行第 0 列元素的地址第 1 行首地址第 1 行第 0 列元素的地址第 1 行第 2 列元素的地址第 1 行第 2 列元素的值

1. 二维数组名作数组的参数 : 分析以下的程序 int fun(int *p) int i,j; for(i=0;i<3;i++) for(j=0;j<4;j++) return 0; *(p++)=i+j; main() int a[3][4]=1,2; 二维数组的指针作函数的参数 fun(a[0]); printf( %d\n,a[2][3]);

2. 指向二维数组的行指针作函数的参数分析以下的程序 #include <stdio.h> void fun(int (*)[3], int); int main() int a[3][3],(*p)[3]; p=a+1; fun(a,3); printf("%d\n",*(p[1]+2)); return 0; void fun(int (*p)[3],int size) int i,j; for(i=0; i<size; i++) for(j=0; j<3; j++) *(*(p+i)+j)=(i+1)*(j+1);

指向多维数组的指针 : 难点在于地址计算 ( 以二维数组为例 ) a[3][4]=2,3,4,5,4,5,6,7,1,4,5,6; 1 a 为首地址, 是常量, 对 a 进行算术运算, 以一维数组在内存中所占的内存单元为偏移量 : 假设 a 为 2000,2 字节字长 ; 则 a+1 为 2008 2 对于二维数组 a 而言, 是由 3 个一维数组组成的 : a[0],a[1],a[2] a[0],a[1],a[2] 是相应一维数组的首地址,*(a+0)= =a[0], *(a+1)= =a[1],*(a+2)= =a[2] 3 对于 a[0],a[1],a[2] 的算术运算以一整型元素为偏移量 : a[0]+1 为 2002

3 (a+0)+2 与 *(a+0)+2 不同, 前者使指针定位于第三行, 而后者使指针定位于第一行第三个元素 4 a+i=a[i]=*(a+i)=&a[i]=&a[i][0] 尽管在数值上相等, 但具有不同的含义 ; a+i=&a[i] 相同, 他们在行移动 a[i]=*(a+i)=&a[i][0] 相等, 它们已定位至列 ; 5 对于数组的描述而言, 一维数组只需一下标, 而二维数组则需要两个下标, 这对于确定指针定位非常有意义 : 6 当 a 有一个整型量在进行算术运算时, 则以一维数组为偏移量 ; 如果有两个整型量在进行算术运算, 则以一个基类型元素为偏移量, 区别它们只需加上一整型值 例如 :a[i] 与 a+i a[i]+2,a+i+2, 前者已经有两个下标, 而后者仍然是一个下标

指向数组元素的指针变量 地址的移动以基类型元素为偏移量

#include <stdio.h> #include <time.h> #include <stdlib.h> main() int a[3][4]; int *p; srand(time(null)); for (p=*a;p<*a+12;p++) *p=rand() % 100; printf("data items in original order\n"); for (p=*a;p<*a+12;p++) printf("%5d",*p); for (p=&a[0][0];p<a[0]+12;p++) if((p-a[0])%4==0) putchar('\n'); printf("%4d",*p); putchar('\n'); return 0;

指向一维数组的指针变量 地址的移动以一维数组为偏移量

#include <stdio.h> #include <time.h> #include <stdlib.h> main() int a[3][4]; int (*p)[4], i, j; p=a; srand(time(null)); for (i=0;i<3;i++) for (j=0;j<4;j++) *(*(p+i)+j)=rand() % 100; printf("data items in original order\n"); for (i=0;i<3;i++) for (j=0;j<4;j++) printf("%5d",*(*(p+i)+j)); putchar('\n'); putchar('\n'); return 0;