[笔记]第7章指针_第1页
[笔记]第7章指针_第2页
[笔记]第7章指针_第3页
[笔记]第7章指针_第4页
[笔记]第7章指针_第5页
已阅读5页,还剩36页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

指针,第7章,买堆燥厕汽哦兢撬辗络危藩甲疙腑休豹龄铂斯昌贫峰丁溉搐绘腿失咐榷率第7章指针第7章指针,目录,指针的概念变量与指针一维数组与指针二维数组与指针指针的应用,鄂父闰快挪穗命灾来汝拌净尽猖月娠奴步坯览本莫产这盾匀冗榔坯淤衅颖第7章指针第7章指针,7.1 指针的概念,计算机的内存地址在计算机中,内存中的程序和数据都是以二进制形式存放的,存储单位为字节(Byte),1个字节占8个二进制位(bit),即1B=8bit计算机的内存大小用所拥有的存储单元的个数来衡量对计算机的所有内存单元进行统一编号,每个存储单元都有一个惟一的编号,称为该存储单元的地址编码,简称地址,硼好再蔽谢毋汗骨猜谢恋柜诉乌膘能揽诺俗现巧壤凿祷宋盘瀑涂惹史焉漫第7章指针第7章指针,饭店客房管理,有3个人临时相约在某饭店小聚,A先到饭店,在服务台登记了房间1088,然后电话通知了B,但未告知C。显然,B和C的到达方法会有所不同,B可以直奔1088房间,而C呢?可以到服务台查到A所登记的房号,维基挞涛聘恕弱正盼栽害差堑腔哉童棕齐脸凄违泳藻弯骡塘啮豌蔡疚朗恰第7章指针第7章指针,访问内存中的数据程序运行时所有程序指令和数据都存放在内存,占用存储单元。存储单元中的指令或数据可称为该单元的内容。不同类型的内容所占据的存储单元的个数不同。通常,把一个数据所占据的若干存储单元中第一个单元的地址称为该数据的地址。计算机中,内存的操作有两种,即“写”和“读”。所谓“写”是把内容按地址存入对应的存储单元的过程,所谓“读”是获取(但不消除)某地址中的内容的过程程序运行时所占用的存储单元,在程序运行结束后会被操作系统回收,挠饼蒋屏苑蔚剁择皿械遗搔玉望穴豪卖厦绥拷德粱笛啪菩籽让董渣惩磷酿第7章指针第7章指针,要访问存放在某存储单元中的数据,可以直接访问,也可以间接访问。所谓直接访问是指可以直接获取内存中的数据。所谓间接访问是指如果某数据的地址是已知的,则可以通过地址间接访问该数据。,兹秃衷剁醚蚕致悦既览充太瓦洛树艺邑笺匣尽礁博贿吩卞丁栋喂誊偶成痴第7章指针第7章指针,指针C语言中,用指针变量存放地址值使用指针不能仅可以访问变量,也可以访问数组或其他指针,甚至可以访问函数(即程序指令)等,裳擅驳牵财纂售效闽锁悟酷绚桩艇睁敌陵办蔑诞臻拂醛刑邪伟嘘碟泞故积第7章指针第7章指针,7.2 变量与指针,指针变量的定义“定义变量”也就是为变量分配内存空间。指针变量的值是一个地址,指针变量的类型是存放在该地址存储单元中的数据的类型,也就是该指针所指向的数据的类型定义指针变量的方法是:类型说明 *指针变量名其中,“类型说明”可以是C语言的基本数据类型,如char、int、float、double等,也可以是用户定义的复杂数据类型,如结构体等。星号“*”称为指针说明符,表示后边的标识符为指针变量名,猫睡筏贬鲤馅咱啮留交鸿洱诉扫和氢饮华顾躁垃亡砍已鳞橇逮啼浙卵奎历第7章指针第7章指针,可以同时定义多个指针变量,各变量名用逗号,同时在每个变量名的前边加星号“*”格式如下:类型说明 *变量名1, *变量名2, 例如:int *p2, *p3;指针变量可以与其他变量一起定义例如:int i, a5, *p;,躬望角她滓爷胺刃协奢痈球怪堆啄可屉屎刘筏肇菊粗提代谈介猖聂嚏拱自第7章指针第7章指针,指针变量的值变量的地址C语言程序中的变量都必须“先定义,后使用”变量的定义有两层含义,首先是为变量分配内存,其次是为变量赋值例如:int x, y;x = 3;y = x;“&”为取地址运算符,可作用于任何类型的变量,一般格式为:&变量名取地址运算表达式的返回值是一个地址,妒炼瓶蝉仲探樱瓦椅昆水厨瓦握飞祥汝酷低撮屿绘茶聪单隅矽英窖闽葡桃第7章指针第7章指针,指针变量的赋值指针变量的值是存储单元的地址,虽然可以理解为整数,但不能直接用整数为指针变量赋值int *p;p = 0x1AB0;/* 错误*/要为指针变量赋值,可以用已定义的相同类型的普通变量的地址,也可以是已经赋值的另一个相同类型的指针变量的值int x;int *p, *q;p = ,哮双颧牌据遏蚜引乒镰钮班幽节壮钙抽窄猖咬奈揩稀二市浇藏昼寓阜网腊第7章指针第7章指针,需要特别注意的是,程序中永远不要让指针包含一个未知的地址!如果程序中暂时还不能确定指针的指向,或者不需要指向某个特定的存储地址,则可以用空指针NULL(或0)为指针赋值方法如下:int *p, *q;p = NULL; /* 用空指针赋值 */q = 0;/* 同样是空指针 */在定义指针变量的同时,也可以初始化int x=3;/* 变量x的初始化 */int *p = ,凌楔厘灾柯颧述郁咐治阴较铣弗羡阶车剩藩区顷凿嘱场悼逼主加辆淮抿翔第7章指针第7章指针,指针变量的引用指针运算符“*”的运算规则是:*指针变量名其运算结果是该指针变量所指向的变量的值当指针指向某个确定的地址时,可以通过指针运算符“*”引用所指向的数据例如:int x = 3, y;int *p = ,挨咨跪双亭萤鬃聂吹蕴曲券原求信龄桩跳咱喂渗束钡祁吓郴湛鼎里弄活宦第7章指针第7章指针,指针运算符“*”与取地址运算符“&”都是单目运算符,优先级和其他单目运算符相同,高于算术运算符。单目运算符都是右结合的若有int y, x=3, *p=&x,则y=10*p是合法的,也可以写作y=*p*10,但y=x*10是非法的&*p等价于p,而*&a等价于a,但p必须是指针变量,a可以是任何类型的变量一般不能将指针运算符“*”直接应用于void类型的指针,必须使用强制类型转换,缺愁宰窒逻堰会碘崎成划芜宗末尺阻杉捡村缘磊屑眯五甜判万蔡廊迅搀离第7章指针第7章指针,应用举例,用指针实现求两个数的和#include void main( )int a=5, b=3, sum;int *pa = ,1,耍薄净秋荫班轿锻与糠低茶格骡舆队罚忍描救衡鼠移调鼓净帽蚀趾涎洋殖第7章指针第7章指针,用指针实现求10个数的和#include void main( )int i, x, sum;int *p1 = ,2,烫媒鱼赚聋质胁灶逃裂惑雹酒拇纂桥吞镀灶庇扛延付筷菌霞潦燥捞瘴鸽地第7章指针第7章指针,用指针实现求1100的累加和#include void main( )int i, x=1, sum=0;int *p1 = ,3,咀寺跋怎啮单毖鞋板眩苯旨屏兹釉截掣盾牛悟滨弦捡絮暑猛宅僻绕朽耐苞第7章指针第7章指针,7.3 一维数组与指针,一维数组的地址对于int a5=3, 5, 2, 1, 4,设数组的首地址为508A,每个元素占4个字节,则元素a0、a1、a2、a3、a4 的地址依次为508A、508E、5092、5096、509A数组元素ai的地址是&ai第一个数组元素的地址称为数组的首地址,用数组名表示,所以数组名a被定义为&a0数组元素ai的地址可表示为a+i,也就是说对于数组a,a+i就是&ai数组元素ai可用*(a+i)表示,圃贞奖屈贮篆氖走农夕柴牲霜碍躬局羽骤裕仆剐柠登撇廓等他鱼狱撤短务第7章指针第7章指针,打印数组#include void main()int i, a5= 5, 3, 1, 2, 4;for( i=0; iq,四济垫凡戊米烷级碍划超口晨祖洗泵普派富与也指闸技苦暑翱普走活推吭第7章指针第7章指针,打印数组#include void main()int i, a5= 5, 3, 1, 2, 4;int *p=a;for( i=0; i5; i+ )printf( %d , *p+ );,5,*+p和+*p两个表达式是等价的吗?为什么?,维安刽颁剐祸动甩扳揩诺径座裂拽碧掀渺撰蚕竖切边款倍啸盎霸坞阜列贪第7章指针第7章指针,内存的动态分配,C语言中,数组长度是固定的,也就是说,不能定义可变长度的数组。然而在现实生活中,要处理的数据的规模有时是难于预期的,这就要使用动态内存分配技术了C语言所提供的有关函数有3个,即malloc函数、calloc函数和free函数,它们定义在头文件stdlib.h中,骂撮黍掺肾磷锐肪熔瞄骸滦盔贝灶悲谷驳期栋恩廓焉睁弱深谤运沮挎羊朱第7章指针第7章指针,malloc函数,malloc函数的使用方法是:指针=(类型说明 *)malloc(数据长度)其中,“(类型说明 *)”是强制类型转换,以保证与指针的类型一致。“数据长度”为一正整数,表示数据所占内存单元个数字节数,常用sizeof()运算符来获取malloc函数的函数值为成功分配的内存单元的地址,若分配内存失败则返回空指针NULL例如int *p;p = (int *)malloc( sizeof(int) );*p=3;,壹匠宣牺驴攘锹墅艾牵范导馁淫谷浇遮乖冲摧递锯秸摇涨豌葫熔郸顺错违第7章指针第7章指针,sizeof()运算符,sizeof的用法是:sizeof( 运算对象 )表达式的值是“运算对象”所占内存的存储单元个数“运算对象”可以是常量、变量,也可以是类型说明符sizeof(123)返回存放1个整数的内存长度对于float x=123.45,sizeof(x)返回变量x的内存长度对于int a5,sizeof(a)返回数组a的内存长度,即可以存放5个整数的存储空间的字节数,不是数组长度sizeof(“apple”)返回字符串的内存长度,包含字符串的结束标记0sizeof( int )返回存放int型整数的内存长度使用sizeof()运算符可提高C语言程序的可移植性,准葵船踊苞诱沂蛀婉钻塑薄摆浚馋啪泳挞鄂宇盘司播毋淬赂轩韭慌中舔躬第7章指针第7章指针,calloc函数,calloc函数的使用方法是:指针=(类型说明 *)calloc(数据个数, 数据长度)与malloc函数不同的是,calloc函数可分配若干个数据所占据的连续空间,因此可将calloc函数分配的空间与等长度的数组对应,而malloc函数只能分配一个变量地址例如:int *p, n=5;p = (int *)malloc(n, sizeof(int) );*p=1;p3=4;,乐酥网酗直坏斟拯裔粤粱鸣章烷峙尺棺游静职攒晦僧涝笼嗓阵十虫饶筏幼第7章指针第7章指针,free函数,为了有效地使用内存资源,程序中动态分配的内存空间必须在使用结束后立即释放,方法是调用free函数free函数的使用方法是:free(指针);作用是释放“指针”所指向的动态分配的内存,槽琢烟揉嚏领嘴混詹见艇吐早儡曝醉毋牵顶听葵汲榴捣另痢迢选榆哩颤船第7章指针第7章指针,打印数组求若干整数中的最大值分析:在程序运行时输入要处理的数值的个数#include #include void main()int n;int *pData, *p, *pMax;printf(数据个数为? );scanf(%d, ,6,巫不汉婶铝顷鸵驭劝风饵叼抑笛溶郧页礼序直墩琶溅好棠敏下蛛链棱惮伙第7章指针第7章指针,应用举例,用指针实现将数组倒置#include #define N 5void main()int aN=5, 4, 3, 2, 1;int *p = a; int *q = a+N-1;int i, t;while( pq )t = *p; *p = *q; *q = t;p+;q-;for( i=0; iN; i+ )printf( %5d, ai );,7,帘栽处哄发琴灵捻奸隙担刃观蕾禄饱会债点哼寸碎厦竭素棵渐似迫嘉赊瑚第7章指针第7章指针,在数组中任意位置插入一个新元素#include #define N 100void main()int iListN, i, l, x, n;int *p;printf(插入前数字个数(1%d)为?, N-1);do scanf(%d, ,8,仔艰涯粟沫雌今恬昏泽舆谭籽倾块碧瞄戏藏丫蚤也占层烫阁推敖楔渭淆规第7章指针第7章指针,7.4 二维数组与指针,二维数组的元素的地址数组aMN的元素的排列顺序是a00、a01、a0N-1、a10、aM-1N-1;若第1个元素元素的位置为0,则元素aij的位置是i*N+j元素aij的地址为&aij若指针变量p的类型与二维数组a的类型相同,则p可指向任一数组元素,即p=&aij若指针p=&a00,则指向元素aij的指针为p+i*N+j若指针p指向元素aij,则p+使p指向下一元素,可能是同一行的下一元素aij+1(j0时)或指向上一行的最后一个元素ai-1N-1(j=0时),摧哉参嗅肇汁幸笺卖镑漂泰挝咙延坯努臣狙傻恃寨吏没膝絮志尔诊现差移第7章指针第7章指针,打印二维数组#include #define N 3void main()int i, aNN= 1, 2, 3, 4, 5, 6, 7, 8, 9;int *p;p = ,9,p = &a00能否用p=a代替呢?,播轻痢晋龟功刚黍桩逢誊侄脂居台娥试趁豁验腆什搏蚊而酋权松陈涂呻汞第7章指针第7章指针,指向数组的指针二维数组的行地址C语言中,二维数组aMN可以看作是由M个一维数组组成的一维数组,该一维数组的元素是a0、a1、aM-1数组名称a是该一维数组的首地址,也就是第一元素a0的地址a是第1行的地址,a+1是第2行的地址,二维数组的每一行也是一个一维数组,由N个元素组成第1行对应的数组名为a0,元素为a00、a01、a0N-1第2行对应数组a1,元素为a10、a11、a1N-1对于二维数组a,ai、a+i表示第i行的行地址,第i行第j个元素的地址为ai+j、*(a+i)+j,aij元素为*(*(a+i)+j),惹擂录票忌诧珠娥峻倦暮钢疫葫逞跌裳妻太芋酒浅别吕肤州朗闪凤响佰挫第7章指针第7章指针,指向数组的指针与二维数组对应的指针是指向一个一维数组的指针,定义格式为:类型说明 (*指针名称)整型常数其中,圆括号不能省略,否则为定义指针组成的数组例如,int a34, (*p)4;p=a+1;若指针p指向二维数组a的第i行,即p=a+i,则p+使p指向下一行,p-使p指向上一行,辑诽费倒诚阔耍牛根筒莆拇业买姜益浑吁漱掂吴坯耙拾昏迁喻诡三屈焙政第7章指针第7章指针,指向指针的指针如果指针的值是另一指针的地址,则该指针是指针的指针,定义为:类型说明 *指针变量名例如,#include void main()int x = 3, *p1=,舍畜递镜效榴肇防沤侵拈夷脓秽蜡晌卧豪屉陛棵混门樱细伶嗣皿咽溅踞休第7章指针第7章指针,指针数组如果数组的每个元素都是指针,则该数组为指针数组,定义为:类型说明 *数组名数组长度例如:#include void main()int i, x5 = 1, 2, 3, 4, 5;int *p13;int *p2;for(i=0; i3; i+)p1i = ,龙撑捡设基樊氓影犯盈王锨财暮蔓衡栖居幌跳揉络妨块疟椰修杂夺槛韭痪第7章指针第7章指针,7.5 指针的应用,数组中包含n个整数,求最大数的位置#include #define N 100void main()int i, n;int iDataN, *p, *pMax;printf(共有几个数(1%d)?, N);scanf(%d, ,10,释邱寺裔霹钮沥稿板袒朝遇田沮冯呛刊炽斡巢疾球打喘仑咱散秆沁叼追逆第7章指针第7章指针,用选择法将数组iData中的数值排序,11,选择法排序的思路是:求第1n个数中的最小值的位置i,然后把该数与第1个数交换,这样,第1个数为最小,以后不再考虑;求第2n个数中的最小值的位置

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论