第八章指针

合集下载

C++程序设计 第八章 指针和引用

C++程序设计  第八章 指针和引用
C++

在程序运行时变量和函数都存放在内存中,通过变量名来访问数据、通过函数名来调用函数都是直接访问方式。还有另一种间接访问方式就是用指针。指针的本质是内存地址。指针往往用于说明函数的形参,使实参能通过指针传递,以提高函数调用的效率。利用指针能动态地使用内存,以提高内存使用效率。指针也能用来表示数据关联,以构成复杂的数据结构。指针是C程序中最常见的类型。引用是C++扩展的新概念,主要用于函数形参和返回类型。本章将详细介绍指针和引用的概念及应用。
首先,这6个变量的地址是按递减次序排列,这是因为局部变量都存储在堆栈中,堆栈是先入后出的。先入栈的数据存放在较大地址位置,后入栈的数据存放在较小地址位置。如果这些变量改为全局变量,它们的排列次序就会颠倒过来。
其次,尽管变量s只占2字节,变量c只占1字节,但却分别占用4字节空间。这是因为按字对齐(32位数据)能提高CPU访问内存的效率,而且一次压栈和出栈操作也是以32位数据为单位,代价是浪费一些内存。如果这些变量改为全局变量,它们将按实际大小存储。
怎样能知道一个变量在运行时刻的内存地址?把取地址运算符&放在变量前面就得到它的首地址。例如b是一个变量,那么&b就表示它的地址。下面例子能看到一组局部变量的首地址。
例8-1显示一组局部变量的首地址。
#include<iostream.h>
void main(){
bool b = true;
char c = 'c';
其中,<类型名>是这个指针变量所指向的对象的类型,简称指针类型,它可以是任何一种类型。*表示这个变量是一个指针变量。这个变量的类型就是“<类型名>*”。<变量名>是一个标识符。指针变量可以进行初始化,等号之后给出一个变量的地址,要求这个变量的类型与指针类型相符。

C语言 第八章

C语言 第八章

p
printf(“%d,%d\n”,a,b); printf(“%d,%d\n”,*p1,*p2);}
三、指针变量作为函数参数 作用:将一个变量的地址传送到另一个函数中。 作用:将一个变量的地址传送到另一个函数中。 例1:编写实现两个数的交换的函数 : swap(int *p1, int *p2) *p2) void swap(int *p1, int swap(int x,int y) {{ int temp; 定义为*temp? ? int temp; 定义为 { int temp; temp=*p1; temp=x; temp=*p1; *p1=*p2; x=y; *p1=*p2; y=temp; } *p2=temp; } *p2=temp; } main() main() main() { int a,b,*p1,*p2; { int a,b; { int a,b p1=&a;p2=&b; scanf("%d,%d",&a,&b); scanf(“%d%d”,&a,&b); scanf(“%d%d”,p1,p2); swap(a,b); swap(&a,&b); swap(p1,p2); printf("\n%d,%d\n",a,b); printf("%d, %d\n",a,b); printf("%d, %d\n",a,b); }} }
个字节的问题) 个字节的问题)
二、指针变量的引用 “&”(地址运算符 取变量的存储地址。如:&a求变量 的地址。 地址运算符) 取变量的存储地址。 地址运算符 求变量a的地址 求变量 的地址。 “*” (引用运算符 取指针所指向变量的内容。&与*优先级相同, 引用运算符) 取指针所指向变量的内容。 与 优先级相同 引用运算符 优先级相同, 但按自右至左的结合方向。 但按自右至左的结合方向。 例如: 例如:int i=3,*p; p=&i;

永恒指针

永恒指针

つかみかけた梦(ゆめ)のかけらカワラナイモノ追寻的梦想碎片不曾改变tsukamikaketa yumenokakera kawaranaimono追(おい)ってる仆(ぼく)らは憧(あこが)れ大空(だいくう)に浮(う)かべて不断追逐的我们漂浮在向往的天界ooteru bukurawa akogare oosorani ukabete疲(おつか)れ果(は)てたときの中(なか)でもカワラナイモノ即使在厌倦的时候也依然如故tsukare hateta tokinonakademo kawaraniimono探(さが)すコンパスねぇいつまでも持(も)っていれるかな探索的指针永远留在身边sagasu konnpasu nee itsumademo mooterirerukana小(ちい)さな思(おも)い出(で)そっと开(ひら)いたノート丝丝的记忆就像悄悄打开的日记chisana omoida sooto aitanooto古(ふる)い过去(かこ)の行动(こうどう)を缀(つず)ったノート记录着遥远过去的点点滴滴furuikakou nokoudouwo tsuzuuta nootoそれは丁度(ちょうど)引(ひ)き出(だ)しの一番(いちばん)奥(おく)のほうの今(いま)も大切(だいせつ)な宝物(ほうもつ)那正是如今最珍贵的宝物引出最深层的意义sorawa choudohikidashino ichibanokunohouno imamodaisetsuna takaramono眠(ねむ)りに付(つ)く前(まえ)访(おとず)れる梦(ゆめ)の构想(こうそう)少(すこ)しずつ形(かたち)変(か)えながらも俺(おれ)は気(き)づくと大人(おとな)になり熟睡前造访的梦虽然有些微微变形但我也渐渐意识到一个成熟的自己nemurini tsukukoro tazureruyumeno kousou katachi kaenagaramo orewa kizukuto otorani nari How to make my dream come true分(わ)かるはずなんて无(な)いせいでブルー明明应该知道答案却又因懵懂而忧郁wakaruwa zunante naiseide buruu四苦八苦(しくはっく)缲(く)り広(ひろ)げ涙(なみだ)出(で)る梦见(ゆめみ)る心(こころ)のみ残(のこ)る心里只残留下苦苦打拼辛酸血泪shikuhaaku furihiroge namitaderu yumemirukokoro nominokoru星屑(ほしくず)のように散(ち)った梦(ゆめ)のかけら如星尘般渐渐消散的梦想碎片hoshikuzuno youni saata yumenokakera今(いま)はもう消(き)えているその辉(かがや)きが虽然眼前的光辉已经消失殆尽imawa mou kieteiru sonokagayakigaでもまだ皆(みんな)胸(むね)奥底(おくそこ)どこかずっと大切(だいせつ)な宝物(ほうもつ)但仍然是彼此心灵深处最珍藏的印迹demomada minamureokusoko dokokazuuto daisetsunatakaramono幼(おさな)き顷(ころ)の梦物语(ゆめものがたり)忘(わす)られじ记忆(きおく)の糸(いと)辿(たど)り小时候的梦幻童话是无法抹去的记忆丝絮asanakugorono yumegatari wasurareji kiokunotakori未(いま)だ胸(むね)を焦(こ)がす残(のこ)り火(ひ)を消(け)してしまわないように就像心中烙印的火苗还未熄灭imadamurewo kogasu korihowokeshiteshimawanai youni见惯(みな)れた晴(は)れ渡(わた)るこの空(そら)に仲间(なかま)とともに思(おも)いを托(たく)し和伙伴们一起向着那片熟悉的晴空万里minareta harewataru konosorani nagamato tomoni omoiwo takushi移(うつ)り変(か)わる时代(じだい)を超(こ)え永久(とわ)に永久(とわ)に…许下超越时空界限的誓言直到永远永远…utsuri kararu jidaiwo koetowani towanitowani运命(うんめい)なんて言(い)って良(い)いのかな命运这种东西不值一提unmeinante iite yoinokanaこの出会(であ)いは同(おな)じもの持(も)った者(もの)同士(どうし)夜通(よどお)し语(かた)った笑(わら)ったはしゃいだあの夜(よる)に见(み)つけた一番(いちばん)星(ほし)这种相逢就是志同道合的朋友彻夜谈心一起开怀大笑释放心情时看见的那颗夜里最亮的星konodeaiwa onajimono mootamonodoushi yorudooshi takaata waraata hashiyaida anoyoruni mitsuketa ichibanboshiそんな思(おも)いを新(あら)たに缀(つず)ったノート在日记里写下这新的回忆sonna omoiwo aratani tsuzuuta nooto次(つぎ)のページたどり着(つ)く为(ため)の方法(ほうほう)と方向(ほうこう)为了下一页追寻的目标和方向tsugino peejitadori tsukutamenohouhouto houko今(いま)は帆(ほ)を扬(あ)げて共同(きょうどう)で走(はし)り出(だ)したとうとう现在就扬起风帆一起出发imawa howokakagete kyoudoude hashiridashitatoutou进(すす)む航路(こうろ)をGO!沿着前进的航线GO!susumukourowo GO!共(とも)に几(いく)つもの季节(きせつ)を通(とお)り越(こ)して共同度过了多少个春夏秋冬tomoni ikutsumono kisetsuwo toori koshite长(なが)い间(あいだ)ずっと同(おな)じ梦(ゆめ)を追(おい)ってる一起追逐同一个梦想nagaiaita zuutoonajiyumewo ooteru振(ふ)り返(かえ)ればすぐに投(な)げてきたんだ偶尔回首往事却又马上抛向脑后furikaereba suguni nagetekitandaそんな过去(かこ)をちょっと改(あらた)めて那种过去已经渐渐变味sonna kakouwo chooto aratamete今(いま)ただ风(かぜ)に身(からだ/み)を任(まか)せて进(すす)む方向(ほうこう)に思(おも)いを乗(の)せるだけで现在只要坚定信念朝着风前进的方向imatada kazeni karatawo makasete susumuhoukoni omoiwonoserudakete[决(けっ)して谛(あきら)めない]なんて言(い)わないだけで即使[永不放弃]不说出口keeshite akiramenai nanteiwanidakede分(わ)かってるから声(こえ)よ届(とど)け!你的心声也能让全世界体会wakaaterukara koeyotodoke幼(おさな)き顷(ころ)の梦物语(ゆめものがたり)忘(わす)られじ记忆(きおく)の糸(いと)辿(たど)り小时候的梦幻童话是无法忘记的记忆丝絮asanakugorono yumegatari wasurareji kiokunotakori未(いま)だ胸(むね)を焦(こ)がす残(のこ)り火(ひ)を消(け)してしまわないように就像心中烙印的火苗还未熄灭imadamurewo kogasu korihowokeshiteshimawanai youni见惯(みな)れた晴(は)れ渡(わた)るこの空(そら)に仲间(なかま)とともに思(おも)いを托(たく)し和伙伴们一起向着那片熟悉的晴空万里minareta harewataru konosorani nagamato tomoni omoiwo takushi移(うつ)り変(か)わる时代(じだい)を超(こ)え永久(とわ)に永久(とわ)に…许下超越时空界限的誓言直到永远永远…utsuri kararu jidaiwo koetowani towanitowani今(いま)さら梦(ゆめ)なんて见(み)るのもかっこ悪(わる)いなんて言(い)われて如今宣称实现梦想尚存一丝汗颜imasara yumenante mirunomokaako aruinanteiwarete振(ふ)り返(かえ)るゆとりも无(な)いほど足早(あしばや)に时间(じかん)だけが过(す)ぎていく时间匆匆流逝容不下一秒钟的驻足留恋furikaeruyutorimonanihodo ashibayani tokidakega sugiteikuでもあの时(とき)描(えが)いた想(おも)いは确(たし)かで胸(むね)跃(おど)らせてくれる何(なに)かで但能感觉那时描绘的蓝图真真切切在心中涌动demoanotoki egaitaomoiwa tashikade muneodorasetekureru nankade例(たと)え谁(だれ)に言(い)われてもいい仆(ぼく)らはこの道(みち)越(こ)えて不用理会风言风语我们会顺着这条道路大步向前tatoe dareniiwaretemoii bokurawakonomijikoeteきっかけはいつだって些细(ささい)な事(こと)违(ちが)ったのは何(なに(って胸(むね)の鼓动(こどう)总有一些琐碎悄悄改变让心灵为之悸动kiikakewaitsudaatesasainakoto chigaatanowanante munenokoudou変(か)わったのは环境(かんきょう)と风(かぜ)の音(ね/おと)いつもそこにあったカワラナイモノ…有的只是环境的变迁和风音的变奏而有些东西永远不曾改变…kawaatanowa kankyoutokazenooto itsumosokoni aata kawaranaimonoいつかたどり着(つ)く梦(ゆめ)の终(お)わりに出(で)る気(き)だけこのままで大人(おとな)に直到有一天追寻的梦想就要走到终点心中回荡着的只有那份不断的成长itsukatadoritsukuyumenoowarini dekurudakekonomamade odonani见上(みあ)げた果(は)てしないこの大空(だいくう)に永久(とわ)に永久(とわ)に…就像头顶上那无限伸展的蓝天永远永远miageta hateshinaikonooosorani towanitowaniつかみかけた梦(ゆめ)のかけらカワラナイモノ追寻的梦想碎片不曾改变tsukamikaketa yumenokakera kawaranaimono追(おい)ってる仆(ぼく)らは憧(あこが)れ大空(だいくう)に浮(う)かべて不断追逐的我们漂浮在向往的天界ooteru bukurawa akogare oosorani ukabete疲(おつか)れ果(は)てたときの中(なか)でもカワラナイモノ即使在厌倦的时候也依然如故tsukare hateta tokinonakademo kawaraniimono探(さが)すコンパスねぇいつまでも持(も)っていれるかな探索的指针永远留在身边sagasu konnpasu nee itsumademo mooterirerukanaいつまでも笑(わら)っていたいから…最美的笑容也永远留在我们的颊间…itsumademo waraateitaikara。

《C语言程序设计》第8章指针

《C语言程序设计》第8章指针
}
10.3.3 指针变量和数组作函数参数 数组名作形参时,接收实参数组的起始地址;
作实参时,将数组的起始地址传递给形参数组。
引入指向数组的指针变量后,数组及指向数 组的指针变量作函数参数时,可有4种等价形式 (本质上是一种,即指针数据作函数参数):
(1)形参、实参都用数组名 (2)形参、实参都用指针变量 (3)形参用指针变量、实参用数组名 (4)形参用数组名、实参用指针变量
(4)指针变量的++、--与&、*的结合
对于指针变量的++、--与&、*的结合 使用,关键要注意按照运算符的优先级和 结合性进行。
例如: int a=2, *p; p=&a;
•表达式:(*p)++,按运算符的优先级,等价于 a++。其含义为:取出指针变量p所指向的内存单 元的值(即a的值),a的值加1,送回a的内存单 元,a的值变为3,p的值未发生变化,仍然指向 变量a。
程序说明:printf("%s\n",s);语句 通过指向字符串的指针变量s,整体引
用它所指向的字符串的原理:系统首先输出s 指向的第一个字符,然后使s自动加1,使 之指向下一个字符;重复上述过程,直至遇到 字符串结束标志。
main() { char string[ ]=”I love Beijing.”; printf(“%s\n”,string); }
3.数组元素的引用 数组元素的引用,既可用下标法,也可用
指针法。
10.3.2 通过指针引用数组元素 如果有“int a [10],*p=a;” ,则: (1)p+i和a+i都是数组元素a [i]的地址。
(2)*(p+i)和*(a+i)就是数组元素a [i]。 int a [3]; a [0]——*a a [1]——*(a +1) a [2]——*(a +2)

英语对话

英语对话
…...
直接访问与间接访问
直接访问:按变量地址存取变量值 间接访问:通过存放变量地址的变量去访问变量
…... 整型变量i 3 20 10
例Leabharlann i=3;-----直接访问
2000 2001 2002 2003 2004 2005 2006 2000
变量i_pointer 指针变量

*i_pointer=20;
i &i i=3;
*i_pointer 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、指针变量定义后,变量值不确定,应用前必须先赋值
…...
-----间接访问

k=i; k=*i_pointer;
…...
--直接访问 --间接访问
2000 2001 2002 2003 2004 2005 2006 …... 2000
整型变量i
10
整型变量k
10
变量i_pointer 指针变量
i_pointer 2000
变量i 3 *i_pointer
地址存入 指针变量
&与*运算符
含义 含义: 取变量的地址 含义: 取指针所指向变量的内容 两者关系:互为逆运算 单目运算符 单目运算符 i_pointer 优先级: 2 理解 优先级: 2 &i_pointer 2000

精品课件-C程序设计(第三版)(荣政)-第8章

精品课件-C程序设计(第三版)(荣政)-第8章

第八章 指针
指针类型是对所有类型的指针的总称,指针的类型是指 针所指对象的数据类型。例如,pc是指向字符变量的指针, 简称字符指针。字符指针是基本类型的指针之一,除各种基 本类型之外,允许说明指向数组的指针、指向函数的指针、 指向结构体和共用体的指针以及指向各类指针的指针。在C 语言中只有指针被允许用来存放地址的值,其它类型的变量 只能存放该类型的数据。(很多书中用指针一词来指地址值, 或用指针变量来代表指针,阅读中应注意其具体含义。)
例8.2中指向整型的指针point在定义之后直接使用了,这 两条语句在编译时不会出现语法错误,但在使用时却几乎肯定 会出问题。表面上看,scanf()函数的参数要求给出的是地址, 而point的值就代表的是地址,但是point的值究竟是多少,也 就是说point究竟指向哪里,我们无法得知,在这种情况下就 对point指向的单元进行输入操作,将冲掉point指向的单元的 原有内容,假如这个单元是操作系统的所在处,就破坏了操作 系统,显然是一件危险的事。
为了理解指针的概念,程序员要有关于计算机如何在存储 器中存储信息的基本知识。以下简单地介绍个人计算机中存储 器存储的情况。
第八章 指针
个人计算机中CPU可以直接访问的,用来存储程序和数据 的记忆部件称为内存储器,内存储器由成千上万个顺序存储单 元组成,每个单元由一个惟一的地址标识。给定计算机的存储 器地址范围为从0到所安装的存储器数量的最大值。在计算机 上运行的每一个程序都要使用存储器。例如,操作系统要占用 一些计算机存储空间,每个应用程序也要占用计算机存储空间。 按照面向过程的结构化程序设计方法,程序代码和程序要处理 的数据是分开存储的,所以,一个程序在内存中要占两部分空 间:数据部分和指令代码部分。
第八章 指针

C二级 第8章 指针

C二级 第8章 指针

1.以下定义语句中正确的是A) int a=b=0; B) char A=65+1,b='b';C) float a=1,*b=&a,*c=&b; D) double a=0.0; b=1.1;参考答案:B【解析】A选项语句中b变量还没有定义不能直接用于给a变量赋值。C选项语句中*b、*c表示的是一个实型变量的地址,不能再将&b赋值给指针型变量c。D选项语句中a=0.0后面应该为逗号,不能是分号。2.有以下程序#include <stdio.h>void f(int *p,int *q);main(){ int m=1,n=2,*r=&m;f(r, &n);printf("%d,%d",m,n);}void f(int *p,int *q){ p=p+1;*q=*q+1;}程序运行后的输出结果是A) 2,3 B) 1,3 C) 1,4 D) 1,2参考答案:B【解析】在f(int *p,int*q)函数中,执行p=p+1是将p所对应的地址加1,而*q=*q+1是将q所指向的n的地址所对应的值加1,所以m的得知所对应的值没有变,而n的值则为3了。

因此B选项正确。

3.以下叙述中正确的是A) 如果p是指针变量,则&p是不合法的表达式B) 如果p是指针变量,则*p表示变量p的地址值C) 在对指针进行加、减算术运算时,数字1表示1个存储单元的长度D) 如果p是指针变量,则*p+1和*(p+1)的效果是一样的参考答案:C【解析】B选项中,如果p是指针变量,则*p表示变量p所指向的地址的值;A选项中,如果p是指针变量,则&p表示变量p的地址;D选项中,如果p是指针变量,*p+1表示将p所指的值加上1,而*(p+1)表示的是先将指针右移一位再取所指向变量的值。

因此C选项正确。

4.以下叙述中正确的是A) 基类型不同的指针变量可以相互混用B) 函数的类型不能是指针类型C) 函数的形参类型不能是指针类型D) 设有指针变量为double *p,则p+1 将指针p移动8个字节参考答案:D【解析】B选项中,所谓函数类型是指函数返回值的类型。

高树芳C语言程序设计--第八章

高树芳C语言程序设计--第八章

30
8.5 知识拓展
案例8-11 指针的高级应用 [案例任务] 阅读下列程序 ,分析运行结果,了解指 针的各种应用。
程序代码
31
8.5 知识拓展
相关知识:
1.有关指针的数据类型小结 2.案例说明 3.main函数的参数
32
12
8.2 指针变量
[课堂训练8-1] void swap(int *p1,int *p2) { int *t; t=p1; p1=p2; p2=t; }
1.分析下面的程序,写出运行结果。 #include <stdio.h> void main() { void swap(int *p1,int *p2); int *p1,*p2,a=6,b=8; p1=&a; p2=&b; printf(" 交换前:*p1=%d,*p2=%d\n",*p1,*p2); swap(p1,p2); printf(" 交换后:*p1=%d,*p2=%d\n",*p1,*p2); }
17
8.3 指针与数组
案例8-6 [案例任务]
冒泡排序
使用指针指向一维整型数组,使用冒泡排 序法对数组元素从小到大排序并输出。
程序代码
18
8.3 指针与数组
相关知识: 1.冒泡排序法 2.指针变量的其他运算
19
8.3 指针与数组
案例8-7 [案例任务]
逆置一维数组
使用数组名或指针变量作为函数形参与实 参,完成一维数组元素的逆置。请分析程 序运行结果,并对两个方法进行比较。
6
8.2 指针变量
案例8-2 用指针交换两整数 案例8-3 用指针比较两数大小 案例8-4 用指针参数交换两整数

c语言第8章练习题--指针

c语言第8章练习题--指针

1、int *p 的含义是(B)A.p是一个指针, 用来存放一个整型数B.p是一个指针, 用来存放一个整型数据在内存中的地址C.p是一个整型变量D. 以上都不对2、以下函数用来求出两整数之和,并通过形参将结果传回,请填空。

void func(int x,int y, ___int*____ z){ *z=x+y; }3、有如下程序段(B)int *p,a=10,b=1;p=&a; a=*p + b;执行该程序段后,a的值是A. 12B. 11C. 10D. 编译出错4、若己定义:int a[9],*p=a;并在以后的语句中未改变p的值,不能表示a[1]地址的表达式是( C)A) p+1B) a+1C) a++D) ++p5、以下程序运行后的输出结果是(A)void main( ){ int a[ ]={1,2,3,4,5,6,7,8,9,0},*p;for(p=a;p<a+10;p++) printf("%d,",*p);}A)1,2,3,4,5,6,7,8,9,0,B)2,3,4,5,6,7,8,9,10,1,C)0,1,2,3,4,5,6,7,8,9,D)1,1,1,1,1,1,1,1,1,1,6、下面程序的输出是(D)void prtv(int *x)printf("%d\n", ++*x);}main(){ int a=25;prtv(&a);}A) 23 B) 24 C) 25D) 267、有以下函数(B)char fun(char *p){ return p; }该函数的返回值是A) 无确切的值B) 形参p中存放的地址值C) 一个临时存储单元的地址D) 形参p自身的地址值8、下列程序的输出结果是(7)#include<stdio.h>void fun (int *p1, int *p2){ if (*p1>*p2) printf ("%d\n",*p1);else printf ("%d\n",*p2);}void main ( ){ int a=3,b=7;fun (&a, &b);}9、下列程序的运行结果是(B)void fun(int *a, int *b){ int *k;k=a; a=b; b=k;}main(){ int a=3, b=6, *x=&a, *y=&b;fun(x,y);printf("%d %d", a, b);}A) 6 3 B) 3 6 C) 编译出错D) 0 010、以下程序调用findmax函数返回数组中的最大值(B)findmax(int *a,int n){ int *p,*s;for(p=a,s=a; p-a<n; p++)if ( ) s=p;return(*s);}main(){ int x[5]={12,21,13,6,18};printf("%d\n",findmax(x,5));}在下划线处应填入的是(B)A) p>s B) *p>*s C) a[p]>a[s] D) p-a>p-s11、下列程序段的输出结果是(A)void fun(int *x, int *y){ printf("%d %d", *x, *y); *x=3; *y=4;}main(){ int x=1,y=2;fun(&y,&x);printf("%d %d",x, y);}A) 2 1 4 3 B) 2 1 3 4 C) 1 2 1 2 D) 2 1 1 212、以下程序执行后输出的结果是___84________。

第8章 指针

第8章 指针

已说明过,且变量类型应与指针类型一致。
可以用一个已赋初值的指针去初始化另一 个指针变量。 不要用一个局部变量去初始化 static 型指针。
4、间接引用指针
与指针有关的两个运算符 & 取地址运算符 * 实例: 指针运算符(或称“间接引用”运算符)
void main(){
int a=10; int *pointer_1; pointer_1 = &a; cout<< * pointer_1;

8.1 指针概念
8章
指针
8.5 const指针
8.6 指针与函数
8.2 指针运算
8.3 指针与数组
8.7 字符指针
8.4 堆内存分配
8.9 命令行参数
本章介绍C++的指针。C++语言拥有在运行时获得变量的地址和操作地址 的能力,这种用来操纵地址的特殊类型变量就是指针,指针对于成功地进 行c++语言程序设计是至关重要的。学习本章后要求能够使用指针,能够用 指针给函数传递参数,理解指针、数组和字符串之间的紧密联系,能够声 明和使用字符串数组,正确理解命令行参数。
值。 实例:ch8_9.txt
【 8.5 const指针】
指向常量的指针(常量指针):
在指针定义语句前加上const,表示指向的对象是常量。 不能通过指针来改变所指对象的值,但指针本身可以改 变,可以指向另外的对象。 例: const int a=78;
const int b=28; int c=18; const int *pi=&a; *pi=58; pi=&b; *pi=68; pi=&c; *pi=88; c=98;

C语言程序设计第八章 优化学生成绩分析系统指针.ppt

C语言程序设计第八章 优化学生成绩分析系统指针.ppt

C语言程序设计
1 指针与字符串(5)
1.2 使用字符串指针变量与字符数组的区别(续) 例2 分析下面程序的运行结果
main() { char *a="I Love China!";
a=a+7; printf(“%s\n",a); }
运行结果: China!
9
项目八 优化学生成绩分析系统-指针
C语言程序设计
int a,b,c;
例sc6an将f(给"%出d的,%程d"序,&修a,改&b为);使用函数指针变量定义
的c=方m式ax(a,b);
c=(*p)(a,b);
printf("a=%d,b=%d,max=%d",a,b,c);
}
max(int x,int y)
{
int z;
if(x>y) z=x;
else z=y;
指针数组,有4个元素,每个元素 都是指向整型变量指针变量
Int (*p)[4];
由4个整型变量组成的数组的指针
21
项目八 优化学生成绩分析系统-指针
#include <stdio.h> ma3in指()针数组 (2)
C语言程序设计
p[0]
11
{ 3.1 指针数组(续)
22
static int
33
a[3][4]={{11,22,33,44},{55,66,77,88},{99,110,1224,4133}};
【项目分析】
为了保存一个班的C语言成绩需要借助于一维数组,通过指针对其数 据进行操作。将本项目分成两部分,首先借助于指针对一维数组进 行访问,然后介绍一种新的排序算法—选择排序。

8.指针

8.指针

例 p指向int型数,则 p+1 p+12 例 p指向int型数组,且p=&a[0]; 则p+1 指向a[1] 例 int a[10]; int *p=&a[2]; p++; *p=1; 1
p+i
a[3]
a[4] a[5] a[6] a[7] a[8] a[9]
p+9
指针的算术运算: 若指针变量p1与p2都指向同一数组,如执行p2-p1, 结果是两个地址之差除以数组元素的长度。 即 p2-p1(p2-p1)/d 假设p2指向实型数组元素a[5],p2的值为2020;p1指 向a[3] ,其值为2012, 则p2-p1的结果是(2020-2012)/4=2. 这个结果是有意义的,表示p2所指的元素与p1所指的 元素之间差2个元素。 p1+p2 无实际意义
a+9
a[9] *(a+9)
p+9
*(p+9)
下标法 a[i] *(p+i) *(a+i)
指针法
例 输出数组中的全部元素。
假设有一个a数组,整型,有10个元素。要输出 各元素的值有三种方法:
(1)下标法。
(2) 通过数组名计算数组元素地址,找出元素的值。
(3) 用指针变量指向数组元素。
(1)下标法。(8-3(1).c) #include <stdio.h> void main() { int a[10]; int i; for(i=0;i<10;i++) scanf(″%d″,&a[i]); printf(″\n″); for(i=0;i<10;i++) printf(″%d″,a[i]); }
2000 3 a 2002 4 b

C语言第8章 指针

C语言第8章 指针
数据类型 *函数名(形参表) { 函数体; }
例8-13 求最长字符串。
函数的返回值为指针,指针数组作函数参数。
8.5.2 执行函数的指针变量(P207)
P207 自学
8.6 指针应用举例 (P208)
P208 自学
8.7 动态内存管理 (P214)
动态分配存储空间
malloc( )函数 calloc( ) 函数
2. 变量地址示意图
变量 b 的地址:XXXX 变量b 4字节
例: float b; char c;
变量 c 的地址:XXXX 数组 a 的地址:XXXX
变量c 1字节
int a[2];
数组a 8字节
变量的地址示意图
8.1.1 指针和指针变量(P185)
指针
变量的存储地址称为该变量的指针。
指针变量
for (i=0;i<4;i++)
p[i]=&a[i*3]; printf ("%d\n",p[3][2]);
8.4 指针作为函数的参数 (P199)
指针变量 ① 形参是指针变量,对应实参是 变量地址 数组名 指针变量 ② 形参是数组名,对应实参是 变量的地址 数组名
8.4.1 指针作参数示例
例8-10 两数交换。形参为指针变量,实参为变量
char *p="abcd";
读下列程序段,分析输出结果
(1)
char s[]="ABCD";
char *p; for (p=s; p<s+4; p++) printf("%s\n",p);
读下列程序段,分析输出结果

第8章 指针2-xujh

第8章 指针2-xujh
a[0]=’c’;a[1]=’o’;a[2]=’m’;a[3]=’p’;……;a[7]=’r’; 但语句: p=”computer”; 是合法的。
指针数组与命令行参数
• 在操作系统命令状态下可以输入程序或命 令使其运行,称命令行状态。输入的命令 (或运行程序)及该命令(或程序)所需 的参数称为命令行参数
*(a[0]+1) *(*(a+0)+1)
a+1
对于二维数组: (1)a是数组名, 包含三个元素 a[0],a[1],a[2] (2)每个元素a[i] 又是一个一维 数组,包含4个 元素
a+2
2016 a[2]
a[2][2]
a[2][3]
int a[3][4];
a
2000 2000
a[0]
a+12008
指针数组
• •
指针数组是指针变量的集合 定义形式:类型标识符 *数组名[数组长 度说明]
– 如: int *p[10];

注意事项:
– 字符数组中每个元素可存放一个字符,而字符 指针变量存放字符串首地址,千万不要认为字 符串是存放在字符指针变量中的 – 对字符数组而言,与普通数组一样,不能对其 进行整体赋值,只能给各个元素赋值,而字符 指针变量可以直接用字符串常量赋值
P[0] P[1] P[2]
B A S I C \0 C + + \0 P A S C A L \0
字符指针数组举例(1)
• • • • • • • • • • • • • 例:有若干本书,将书名按字典顺序排序 #include<stdio.h> #include<string.h> main() { char *bname[ ]={"Programming in ANSI C","BASIC","Visual C++ 6.0 Programming ","TRUBO C 2.0"}; int i,m; void sort(char *name[],int); m=sizeof(bname)/sizeof(char *); /*字符串个数*/ sort(bname,m); /* 排序,改变指针的连接关系*/ printf("\n"); for (i=0;i<m;i++) /* 输出排序结果*/ printf("%8s",bname[i]); }

C语言程序设计(第二版)-电子教案-丁亚涛-8587 第8章 指针

C语言程序设计(第二版)-电子教案-丁亚涛-8587 第8章 指针
}
8.5.3 指针与二维数组
• 二维数组其实可以看成由一维数组构造而成。就相当于 几个队列构成一个方阵,方阵由队列组成,队列由具体 的元素--人组成。
• 一级指针只能管理队列,如果管理方阵,则需要二级指 针。
•int a=1000,*pa,**ppa; • pa=&a; • ppa=&pa;
• *(*(ppa)) ≡ *(pa) ≡ a ≡ 1000
• p是二级指针 • *p相当于*(p+0),级别降低为一级指针,相当于p[0] • **p相当于*(*(p+0)+0),级别降低为数组元素(普通变量),
也相当于p[0][0]
• p[1][2],相当于*(*(p+1)+2) • &p[1][2], 级别提升为一级指针,相当于:
• p[1]+2,*(p+1)+2 • &p[1],级别提升为二级指针,相当于:
f=f4; printf("a/b=%d\n",f(a,b));
8.5 指针与数组
• 8.5.1 指针与字符数组 • char str[100]= "Hello World"; • char *p=str; • 字符w可以有如下多种表示形式: • str[6] • *(str+6) • p[6] • *(p+6)
【例8-2】演示指针和数组的关系。
#include <stdio.h>
接可存取,由于p中存储的是x的信息。访问p可以获取x的信 息,再对银行存款进行操作。
8.1 借钱的故事
8.2 指针的概念
• C语言允许使用变量名、数组名[下标]、函数名等标 识符来访问内存

C语言程序设计第八章 指针的使用

C语言程序设计第八章 指针的使用

第八章指针的使用【学习目标】本章将详细介绍在C语言中如何使用指针。

学习要点包括如下几点:(1)掌握指针和指针变量的概念,了解指针变量的特点以及直接访问数据和间接访问数据的原理。

(2)掌握指针变量的定义、赋值方法及指针运算符的使用,熟练运用指针访问简单变量。

(3)熟悉指针和一维数组的关系,掌握指向一维数组的指针变量的定义方法,熟练使用指针变量访问一维数组元素。

(4)了解指针与字符串的关系,能熟练使用指针处理字符串。

(5)熟练掌握用指针变量作函数的参数时函数的定义和调用方法、数组名作函数的参数用法。

(6)指向指针的指针的运用。

【学习导航】本章的在整个课程中的位置如图5-1所示。

图8-1 本章学习导航在本书的第一章介绍C语言有一个灵活性的特点,那么它的灵活性具体体现在哪里呢?其实就是指针。

指针是C语言的精华部分,通过利用指针,我们能很好地利用内存资源,使其发挥最大的效率。

有了指针技术,我们可以描述复杂的数据结构,对字符串的处理可以更灵活,对数组的处理更方便,使程序的书写简洁,高效。

8.1 地址和指针指针是C语言的一种数据类型,类似于整型、字符型等。

既然指针也是一种类型,那么也可以定义该类型的变量,称为指针变量。

指针变量和其他类型的变量的区别是:指针变量存储的是地址。

所以要学好指针,就一定要明白数据在内存中是如何存储的。

计算机所有数据都是存储在存储器里,系统的内存可看作编了号的小房间,如果要取房间的东西(读取数据)就需要得到房间编号。

地址就是内存区中对每个字节的编号。

下面通过两个整型变量来说明。

整型变量x、y(基本整型需4个字节)在内存中的存储如图8-2所示(假设内存编号是从2000开始)。

把变量所占用的存储单元首字节的地址作为变量的地址。

C语言中利用取地址运算符“&”获取变量的存储地址。

例如,&c将返回c的首地址;&x将返回x的首地址。

2000H2004H2008H2012H...图8-2 变量x和y在内存中的存储图8-2中2000H和2004H就是内存单元的地址。

郑秋生版c++答案习题八

郑秋生版c++答案习题八

第八章指针与引用习题答案一、选择题CBCBCC二、简答题(1)&运算符:取地址运算符,用来得到一个普通变量的地址。

*运算符:间接引用运算符,用来获取指针变量所指向变量的值。

(2)指针:一个变量在内存中所占存储单元的首地址称为该变量的指针,也就是指向该变量的指针。

指针中存储的地址是其所指向的变量的地址,指针中存储的地址里的值就是其所指向变量的值。

(3)引用与指针的区别是,通过某个指针变量指向一个对象后,对它所指向的变量通过*运算符进行间接操作,程序中使用指针,程序的可读性差;而引用本身就是目标变量的别名,对引用的操作就是对目标变量的操作。

可以建立数组的指针,但不能建立数组的引用,因为数组是一个由若干个元素所组成的,所以就无法建立一个数组的别名。

(4)const int *p1 表示p1所指向的int变量为常量,int *const p1 表示p1为常量三、改错题(1)int a;b; 改成int a, b;pointer_1=a; 改成pointer_1=&a;cout<<*a<<" "<<*b<<endl; 改成cout<<a<<" "<<b<<endl;cout<<pointer_2*a<<endl; 改成cout<<(*pointer_2)*a<<endl;(2)有int *p,a=9;p=&a;cout<<”the value of p is ”<<*p;四、阅读程序写结果(1)ABCDEFG(2)x=1.5 y=2.5z=4(3)20 50 50 41(4)m-n=15五、编程题(1)实现字符串逆序输出。

#include <iostream.h>#include <string.h>const char *fun( const char *p1 ){while (*p1++);p1--;return p1;}int main(void){char s1[100];const char *q,*p1;cout<<"输入一个字符串:";cin.getline( s1,100);cout<<"逆向输出串:";q=s1;p1=fun(s1);do{cout<<*p1;p1--;}while(q<=p1);return 0;}(2)输入任意一个字符串,将其中的大写字母转换成小写字母。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

第八章指针一、选择题1、设有定义:int n1=0,n2,*p=&n2,*q=&n1;,以下赋值语句中与n2=n1;语句等价的是()A)*p=*q; B)p=q; C)*p=&n1; D)p=*q;2、若有定义:int x=0, *p=&x;,则语句printf("%d\n",*p);的输出结果是()A)随机值 B)0 C)x的地址 D)p的地址3、以下定义语句中正确的是()A)char a='A'b='B'; B)float a=b=10.0;C)int a=10,*b=&a; D)float *a,b=&a;4、有以下程序main(){ int a=7,b=8,*p,*q,*r;p=&a;q=&b;r=p; p=q;q=r;printf("%d,%d,%d,%d\n",*p,*q,a,b);}程序运行后的输出结果是()A)8,7,8,7 B)7,8,7,8 C)8,7,7,8 D)7,8,8,75、设有定义:int a,*pa=&a;以下scanf语句中能正确为变量a读入数据的是()A)scanf("%d",pa) ; B)scanf("%d",a) ;C)scanf("%d",&pa) ; D)scanf("%d",*pa) ;6、设有定义:int n=0,*p=&n,**q=&p;则以下选项中,正确的赋值语句是()A)p=1; B)*q=2; C)q=p; D)*p=5;7、有以下程序void fun(char *a,char *b){ a=b; (*a)++; }main (){ char c1='A', c2='a', *p1, *p2;p1=&c1; p2=&c2; fun(p1,p2);printf("%c%c\n",c1,c2);}程序运行后的输出结果是()A)Ab B)aa C)Aa D)Bb8、有以下程序#include <stdio.h>main(){ printf("%d\n", NULL); }程序运行后的输出结果是()A)0 B)1 C)-1 D)NULL没定义,出错9、已定义以下函数fun(int *p){ return *p; }该函数的返回值是()A)不确定的值 B)形参p中存放的值C)形参p所指存储单元中的值 D)形参p的地址值10、有以下程序段main(){ int a=5, *b, **c;c=&b; b=&a;……}程序在执行了c=&b:b=&a;语句后,表达式:**c的值是()A)变量a的地址 B)变量b中的值C)变量a中的值 D)变量b的地址11、有以下程序main(){ char a,b,c,*d;a=’\’; b=‘\xbc’;c=‘\0xab’; d="\017";print("%c%c%c\n",a,b,c,*d);}编译时出现错误,以下叙述中正确的是()A)程序中只有a=’\’;语句不正确B)b=‘\xbc’;语句不正确C)d="\0127";语句不正确D)a=’\’;和c=‘\0xab’;语句都不正确12、若有以下定义和语句#include <stdio.h>int a=4,b=3,*p,*q,*w;p=&a; q=&b; w=q; q=NULL;则以下选项中错误的语句是()A、*q=0;B、w=p;C、*p=a;D、*p=*w;13、有以下程序int *f(int *x,int *y){ if(*x<*y)return x;elsereturn y;}main(){ int a=7,b=8,*p,*q,*r;p=&a;q=&b;r=f(p,q);printf("%d,%d,%d\n",*p,*q,*r);}执行后输出结果是()A)7,8,8 B)7,8,7 C)8,7,7 D)8,7,814、若有说明:int n=2,*p=&n,*q=p;,则以下非法的赋值语句是()A)p=q; B)*p=*q; C)n=*q; D)p=n;15、有以下程序void fun(char *c,int d){ *c=*c+1;d=d+1;printf("%c,%c,",*c,d);}main(){ char a=’A’,b=’a’;fun(&b,a); printf("%c,%c\n",a,b);}程序运行后的输出结果是()A)B,a,B,a B)a,B,a,B C)A,b,A,b D)b,B,A,b16、若有说明语句:int a,b,c,*d=&c;则能正确从键盘读入三个整数分别赋给变量a、b、c的语句是()A)scanf("%d%d%d",&a,&b,d); B)scanf("%d%d%d",&a,&b,&d);C)scanf("%d%d%d",a,b,d); D)scanf("%d%d%d",a,b,*d);17、若定义:int a=511,*b=&a;, 则printf("%d\n",*b);的输出结果为()A)无确定值 B)a的地址 C)512 D)51118、若有说明:int i, j=2,*p=&i;,则能完成i=j赋值功能的语句是()A)i=*p; B)*p=*&j; C)i=&j; D)i=**p;19、下列程序段的输出结果是()void fun(int *x, int *y){ printf("%d %d", *x, *y); *x=3; *y=4;}main(){ int x=1,y=2;fun(&y,&x);printf("%d %d",x, y);}A)2 1 4 3 B)1 2 1 2 C)1 2 3 4 D)2 1 1 220、下列程序的运行结果是()void fun(int *a, int *b){ int *k;k=a; a=b; b=k;}main(){ int a=3, b=6, *x=&a, *y=&b;fun(x,y);printf("%d %d", a, b);}A)6 3 B)3 6 C)编译出错 D)0 021、有如下程序段int *p,a=10,b=1;p=&a; a=*p+b;执行该程序段后,a的值为()A)12 B)11 C)10 D)编译出错22、有以下函数char fun(char *p){ return p; }该函数的返回值是A)无确切的值 B)形参p中存放的地址值C)一个临时存储单元的地址 D)形参p自身的地址值23、请选出正确的程序段()A)int *p; B)int *s, k;scanf("%d",p); *s=100;……C)int *s, k; D)int *s, k;char *p, c; char *p, e;s=&k; s=&k;p=&c; p=&e;*p='a'; s=p;… *s=1;…24、若有以下定义和语句:double r=99, *p=&r;*p=r;则以下正确的叙述是()A)以下两处的*p含义相同,都说明给指针变量p赋值B)在"double r=99,*p=&r;"中,把r的地址赋值给了p所指的存储单元C)语句"*p=r;"把变量r的值赋给指针变量pD)语句"*p=r;"取变量r的值放回r中25、以下程序运行后,a的值是()main(){ int a,k=4,m=6,*p1=&k,*p2=&m;a=p1==&m;printf("%d\n",a);}A)4 B)1 C)0 D)运行时出错,a无定值26、有以下程序int fun(int x,int y,int *cp,int *dp){ *cp=x+y; *dp=x-y; }main(){ int a, b, c, d;a=30; b=50;fun(a,b,&c,&d);printf("%d,%d\n", c, d);}输出结果是()A)50,30 B)30,50 C)80,-20 D)80,2027、若有定义和语句:int **pp,*p,a=10,b=20;pp=&p;p=&a;p=&b;printf("%d\n",*p,**pp);则输出结果是:()A)10,20 B)10,10 C)20,10 D)20,2028、以下程序的输出结果是()sub1(char a,char b) {char c; c=a;a=b;b=c;}sub2(char *a,char b) {char c; c=*a;*a=b;b=c;}sub3(char *a,char *b) {char c; c=*a;*a=*b;*b=c;}main(){ char a,b;a='A';b='B';sub3(&a,&b);putchar(a);putchar(b);a='A';b='B';sub2(&a,b);putchar(a);prtchar(b);a='A';b='B';sub1(a,b);putchar(a);putchar(b);}A)BABBAB B)ABBBBA C)BABABA D)BAABBA 29、若有说明:int i,j=7, *p=&i;,则与i=j;等价的语句是()A)i= *p; B)*p=*&j; C)i=&j; D)i=* *p;30、要求函数的功能是交换x和y中的值,且通过正确调用返回交换结果。

能正确实现此功能的函数是()A)funa(int *x,int *y) B)funb(int x,int y){ int *p; { int t;*p=*x;*x=*y;*y=*p;} t=x;x=y;y=t;}C)func(int *x,int *y) D)fund(int *x,int *y){ *x=*y;*y=*x;} { *x=*x+*y; *y=*x-*y;*x=*x-*y; }二、填空题:1、有以下程序void f( int y,int *x){ y=y+*x; *x=*x+y;}main(){ int x=2,y=4;f(y,&x);printf("%d %d\n",x,y);}执行后输出的结果是【1】。

相关文档
最新文档