指针的概念一维数组与指针

上传人:wux****ua 文档编号:21769892 上传时间:2021-05-09 格式:PPT 页数:34 大小:581.50KB
返回 下载 相关 举报
指针的概念一维数组与指针_第1页
第1页 / 共34页
指针的概念一维数组与指针_第2页
第2页 / 共34页
指针的概念一维数组与指针_第3页
第3页 / 共34页
点击查看更多>>
资源描述
1第 21讲指 针 的 概 念 、 一 维 数 组 与 指 针 2第 十 章 指 针C程 序 设 计 中 使 用 指 针 可 以 :l使 程 序 简 洁 、 紧 凑 、 高 效l有 效 地 表 示 复 杂 的 数 据 结 构l动 态 分 配 内 存l得 到 多 于 一 个 的 函 数 返 回 值 3程 序 中 : int i; float k; 内存中每个字节有一个编号-地址. .2000200120022005内存02003 i k 编译或函数调用时为其分配内存单元变 量 是 对 程 序 中 数 据存 储 空 间 的 抽 象 1. 变 量 与 地 址10.1 指 针 的 基 本 概 念 4. .2000200420062005整型变量i10变量i_pointer200120022003 v指 针 : 一 个 变 量 的 地 址 ,它 是 一 个 整 数 形 式 的 常 量 。v指 针 变 量 : 专 门 用 来 存 放 地 址 的 变 量 叫 指 针 变 量 , 它的 值 也 可 以 是 数 组 或 函 数 的 地 址 。2000指针指针变量 变 量 的 内 容 变 量 的 地 址指 针 变 量变 量变 量 的 地 址 (指 针 )变 量 的 值指 向 地 址 存 入指 针 变 量2. 指 针 与 指 针 变 量 5含义: 取变量的地址单目运算符优先级: 14(第二高的级别)结合性:自右向左含义: 从某个地址中获取数据单目运算符优先级: 14结合性:自右向左两 者 关 系 : 互 为 逆 运 算3. 取 地 址 运 算 符 px= printf( printf( * printf( /*P146书印错*/运行结果: -直 接 访 问指针变量. .2000200420062005整型变量i10变量i_pointer200120022003 20003 例 *i_pointer=20; -间 接 访 问2 v直 接 访 问 : 按 变 量 地 址 存 取 变 量 值v间 接 访 问 : 通 过 存 放 变 量 地 址 的 变 量 去 访 问 变 量4. 直 接 访 问 与 间 接 访 问 91. 指 针 变 量 与 其 所 指 向 的 变 量 之 间 的 关 系2. 指 针 变 量 的 定 义v一 般 形 式 : 存 储 类 型 数 据 类 型 *指 针 名 ;3变量i2000i_pointer *i_pointer i *i_pointer *i_pointer=3 合 法 标 识 符指 针 变 量 本 身的 存 储 类 型 指 针 的 目标 变 量 的数 据 类 型表 示 定 义 指 针 变 量不 是 乘 法 运 算 符 *例 int *p1,*p2; float *q ; static char *name;注 意 :1、 int *p1, *p2; 与 int *p1, p2;不 一 样 。2、 指 针 变 量 名 是 p1,p2 ,不 是 *p1,*p2。3、 指 针 变 量 只 能 指 向 定 义 时 所 规 定 类 型 的 变 量 。4、 指 针 变 量 定 义 后 , 变 量 值 不 确 定 , 应 用 前 必 须 先 赋 值 。10.2 指 针 变 量 的 定 义 与 引 用 10将 地 址 值 赋 给 指 针 变 量例 int i; int *p= 变 量 必 须 已 说 明 过 ;并 要 求 两 者 类 型 一 致 。例 int *p= int i;例 int i; int *p= int *q=p; 用 已 初 始 化 指 针 变 量 作 初 值例 main( ) int i; static int *p= () . 不 能 用 auto变 量 的 地 址去 初 始 化 static型 指 针一 般 形 式 : 存 储 类 型 数 据 类 型 *指 针 名 =初 始 地 址 值 ;3.对指针变量的操作(1) 指 针 变 量 的 初 始 化 113.对指针变量的操作(续)(2) 指 针 变 量 +/- 整 数 新 的 地 址 int a,b,c,d,*p,*q; p=q=p+1; .20002008200A200220042006200C200E2010 .59整型变量a 整型变量b 整型变量c 整型变量d202259 指针变量p 指针变量q20022004所 加 的 数 值 : 整 数 *字 节 数 q=p-1; p+; +p; 注意:*p+; *+p; 不同于 (*p)+; + (*p);(3) 指 针 变 量 - 指 针 变 量 整 数 (多 少 个 数 ) q-p 1;(4) 关 系 运 算 pq 1; p=q 0; X 12例 main( ) int i=10; int *p; *p=i; printf(“%d”,*p); 危险!例 main( ) int i=10,k; int *p; p= *p=i; printf(“%d”,*p); .2000200420062005整型变量i10指针变量p200120022003随机值4. 指 针 变 量 必 须 先 赋 值 ,再 使 用 ! 13零 指 针 与 空 类 型 指 针v零 指 针 : (空 指 针 )l定 义 :指 针 变 量 值 为 零 例 如 : int * p=0; p指 向 地 址 为 0的 内 存 单 元 ;系 统 保 证 该 单 元 不 作 它 用 ;表 示 指 针 变 量 的 值 没 有 意 义 。#define NULL 0int *p=NULL;lp=NULL与 未 对 p赋 值 不 同l用 途 : u避 免 指 针 变 量 的 非 法 引 用u在 程 序 中 常 作 为 状 态 比 较 例 int *p; . while(p!=NULL) . 5. 零 指 针 14一 般 形 式 : void *类 型 指 针 ;例 如 : void *p; 表 示 不 指 定 p是 指 向 哪 一 种类 型 数 据 的 指 针 变 量 。 使 用时 要 进 行 强 制 类 型 转 换 。6. 空 类 型 指 针例 char *p1; void *p2; p1=(char *)p2; p2=(void *)p1;TC中 分 配 内 存 空 间 的 函 数 返 回 一 个 空 类 型 的 指 针 。 void *malloc(int n); 例 如 : int *p= (int *) malloc(2); 15main() int *p1,*p2,*p,a,b; a=5;b=9; p1= p2= if(ab) p=p1; p1=p2; p2=p; printf(a=%d,b=%dn,a,b); printf(max=%d,min=%dn,*p1,*p2);运行结果:5,9a=5,b=9max=9,min=5 .指针变量p1 指针变量p20002010200220042008 指针变量p2 整型变量b 整型变量a5200892010200820102008例10.3 按先大后小的顺序输出a和b两个整数。 167. 多 重 指 针 一 个 指 针 变 量 的 内 容 就 是 内 存 中 某 个 存 储 区 域 的 地 址 ,这 个 存 储 区 域 中 存 放 的 值 可 以 是 一 个 基 本 数 据 类 型 的 数 据 ,也 可 以 是 另 一 个 存 储 区 域 的 地 址 。 我 们 把 这 种 类 型 的 指 针 叫做 多 重 指 针 。二 重 指 针 (指 向 指 针 的 指 针 )的 一 般 说 明 形 式 为 : 类 型 说 明 符 *指 针 变 量 名 ;例10.4 二重指针的使用。main()int *p1, *p2, i = 10; p1=p2= printf( printf( “/*书错,应为p1*/ printf( 程序的运行结果如下: temp=x; x=y; y=temp;main() int a=10,b=20; if(ab) swap(a,b); printf(n%d,%dn,a,b); . .20002008200A200220042006 10变量a 变量b(main)20 变量temp 变量y 变量x(swap)1010201020COPY值 传 递运行结果:10, 20不能达到预期的结果! 10.3 函数之间地址值的传递1. 形参为指针变量:传 递 的 是 指 针 变 量 的 值 -地 址 。 特 点 : 共 享 内 存 , 相 当 于 “ 双 向 ” 传 递 !例 10.5 将 数 从 大 到 小 输 出 (用 变 量 作 函 数 的 参 数 ) 18swap(int *p1, int *p2) int p; p=*p1; *p1=*p2; *p2=p;main() int a,b; int *pointer_1,*pointer_2; a=5; b=9; pointer_1= pointer_2= if(ab)swap(pointer_1,pointer_2); printf(n%d,%dn,a,b); .20002008200A200220042006200C200E2010 .59整型变量a 整型变量b(main)指针pointer_1指针pointer_220002002(swap)指针p1指针p2整型p5920002002COPY 5例 10.5 将 数 从 大 到 小 输 出 (用 指 针 作 函 数 的 参 数 ) 19swap(int *p1, int *p2) int p; p=*p1; *p1=*p2; *p2=p;main() int a,b; int *pointer_1,*pointer_2; a=5; b=9; pointer_1= pointer_2= if(ab)swap(pointer_1,pointer_2); printf(n%d,%dn,a,b); .20002008200A200220042006200C200E2010 .59整型变量a 整型变量b(main)指针pointer_1指针pointer_22000200259 运行结果:9,5地 址 值 传 递 例 10.5 将 数 从 大 到 小 输 出 (用 指 针 作 函 数 的 参 数 )续 20swap(int *p1, int *p2) int *p; *p=*p1; *p1=*p2; *p2=*p;main() int a,b; int *pointer_1,*pointer_2; a=5; b=9; pointer_1= pointer_2= if(ab) swap(pointer_1,pointer_2); printf(n%d,%dn,a,b); 运行结果:9,9 改 正 为 :int x, *p=x; .20002008200A200220042006200C200E2010 .59整型变量a 整型变量b(main)指针pointer_1指针pointer_2200020029920002002COPY (swap)指针p1指针p2指针p*假 设 2000指 针 变 量 在 使 用 前必 须 先 赋 值 !例 10.5 注 意 : 指 针 变 量 要 先 赋 值 后 , 才 能 进 行 指 针 运 算 !编译警告!结果有时也正确!但也有错的时候! 21/*ch9_32.c*/swap(int x,int y) int t; t=x; x=y; y=t;main() int a,b; int *pointer_1,*pointer_2; scanf(%d,%d, pointer_1= pointer_2= if(ab) swap(*pointer_1,*pointer_2); printf(n%d,%dn,a,b); 运行结果:5,9也不能达到预期的结果!值 传 递 .20002008200A200220042006200C200E2010 .59整型a 整型b(main) pointer_1pointer_2200020029COPY (swap)整型x整型b整型t5559例 10.5 错 误 程 序 之 二 22swap(int *p1, int *p2) int *p; p=p1; p1=p2; p2=p;main() int a,b; int *pointer_1,*pointer_2; scanf(%d,%d, pointer_1= pointer_2= if(ab) swap(pointer_1,pointer_2); printf(%d,%d,*pointer_1,*pointer_2); .20002008200A200220042006200C200E2010 .59整型a 整型b(main) pointer_1pointer_22000200220002002COPY (swap)指针p1指针p2指针p*2000地 址 传 递 02 运行结果:5,9也不能达到预期的结果! 例 10.5 错 误 程 序 之 三 232. 返回值为地址值的函数(例 10.6) #include int *getLocalAddr( void ); float *getMaxAddr( float *px, float *py); main() float x = 10.0f, y = 20.0f, *px = printf( *getLocalAddr() = %dn, *getLocalAddr() ); printf( printf( px = 0 x%lx, py = 0 x%lx, *getMaxAddr( px, py ) = %fn, px, py, *getMaxAddr(px, py) ); int *getLocalAddr( ) int t = 100; return float *getMaxAddr( float *px, float *py ) return (*px*py)?px:py; 24array0array1array2array3array9 .整 型 指 针 p printf( index, Address, size:n ); for( i = 0; i 10; i+ ) printf( printf( Address of a = 0 x%xn, a ); printf( size of a = %dn, sizeof( a ) ); 在 C语 言 中 , 一 维 数 组 的 任 何 一 个 元 素 的 地 址 , 都可 以 用 其 数 组 名 加 上 一 个 偏 移 量 来 表 示 。 即 : a=a+1; a+;p=p+1; p+; 28a0a1a2a3a4#include void main() int a5,*pa,i; for(i=0;i5;i+) ai=i+1; pa=a; for(i=0;i5;i+) printf(*(pa+%d):%dn,i,*(pa+i); for(i=0;i5;i+) printf(*(a+%d):%dn,i,*(a+i); for(i=0;i5;i+) printf(pa%d:%dn,i,pai); for(i=0;i5;i+) printf(a%d:%dn,i,ai); 12345 pa例 数组元素的引用方法 29v数 组 名 作 函 数 参 数 , 实 参 与 形 参 的 对 应 关 系实 参 形 参数 组 名指 针 变 量数 组 名指 针 变 量数 组 名数 组 名指 针 变 量指 针 变 量3. 数组名或指针作形参 30i j 3 7 9 11 0 6 7 5 4 20 1 2 3 4 5 6 7 8 9i ji ji jji 117 6 05 94 72 3void inv(int x, int n) int t,i,j,m=(n-1)/2; for(i=0;i=m;i+) j=n-1-i; t=xi; xi=xj; xj=t; main() int i,a10=3,7,9,11,0,6,7,5,4,2; inv(a,10); printf(The array has been reverted:n); for(i=0;i10;i+) printf(%d,ai); printf(n); m=4例 将数组a中的n个整数按相反顺序存放1. 实参与形参均用数组 31例 将数组a中的n个整数按相反顺序存放 void inv(int *x, int n) int t,*p,*i,*j,m=(n-1)/2; i=x; j=x+n-1; p=x+m; for(;i=p;i+,j-) t=*i; *i=*j; *j=t; main() int i,a10=3,7,9,11,0,6,7,5,4,2; inv(a,10); printf(The array has been reverted:n); for(i=0;i10;i+) printf(%d,ai); printf(n); 2. 实参用数组,形参用指针变量 32例 将数组a中的n个整数按相反顺序存放 void inv(int *x, int n) int t,*i,*j,*p,m=(n-1)/2; i=x; j=x+n-1; p=x+m; for(;i=p;i+,j-) t=*i; *i=*j; *j=t; main() int i,a10,*p=a; for(i=0;i10;i+,p+) scanf(%d,p); p=a; inv(p,10); printf(The array has been reverted:n); for(p=a;pa+10;p+) printf(%d,*p); 3. 实参与形参均用指针变量 33例 将数组a中的n个整数按相反顺序存放 void inv(int x, int n) int t,i,j,m=(n-1)/2; for(i=0;i=m;i+) j=n-1-i; t=xi; xi=xj; xj=t; main() int i,a10,*p=a; for(i=0;i10;i+,p+) scanf(%d,p); p=a; inv(p,10); printf(The array has been reverted:n); for(p=arr;parr+10;p+) printf(%d ,*p); 4. 实参用指针变量,形参用数组 34int *p 与 int q10 数 组 名 是 指 针 ( 地 址 ) 常 量p=q; p+i 是 qi的 地 址数 组 元 素 的 表 示 方 法 :下 标 法 和 指 针 法 , 即 若 p=q, 则 pi qi *(p+i) *(q+i) 形 参 数 组 实 质 上 是 指 针 变 量 , 即 int q int *q在 定 义 指 针 变 量 ( 不 是 形 参 ) 时 , 不 能 把 int *p 写 成 int p;系 统 只 给 p分 配 能 保 存 一 个 指 针 值 的 内 存 区 (一 般 2字 节 ) ;而 给 q分 配 2*10字 节 的 内 存 区一 级 指 针 变 量 与 一 维 数 组 的 关 系
展开阅读全文
相关资源
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!