C语言之指针(难点)</SPAN> 1.变量的指针和指向变量的指针变量</SPAN> 变量的指针就是变量的地址。存放变量地址的变量是指针变量。即在C语言中,允许用一个变量来存放指针,这种变量称为指针变量。因此,一个指针变量的值就是某个变量的地址或称为某变量的指针。</SPAN> 为了表示指针变量和它所指向的变量之间的关系,在程序中用“*”符号表示“指向”.</SPAN> a.定义一个指针变量</SPAN> 对指针变量的定义包括三个内容:</SPAN> (1) 指针类型说明,即定义变量为一个指针变量;</SPAN> (2) 指针变量名;</SPAN> (3) 变量值(指针)所指向的变量的数据类型。</SPAN> 其一般形式为:</SPAN> 类型说明符 *变量名;</SPAN> 其中,*表示这是一个指针变量,变量名即为定义的指针变量名,类型说明符表示本指针变量所指向的变量的数据类型。</SPAN> b.指针变量的引用</SPAN> 指针变量同普通变量一样,使用之前不仅要定义说明,而且必须赋予具体的值。未经赋值的指针变量不能使用,否则将造成系统混乱,甚至死机。指针变量的赋值只能赋予地址, 决不能赋予任何其它数据,否则将引起错误。在C语言中,变量的地址是由编译系统分配的,对用户完全透明,用户不知道变量的具体地址。</SPAN> 两个有关的运算符:</SPAN> 1) &:取地址运算符。</SPAN> 2) *:指针运算符(或称“间接访问” 运算符)。</SPAN> C语言中提供了地址运算符&来表示变量的地址。</SPAN> 其一般形式为:</SPAN> &变量名;</SPAN> 如&a表示变量a的地址,&b表示变量b的地址。变量本身必须预先说明。</SPAN> 设有指向整型变量的指针变量p,如要把整型变量a 的地址赋予p可以有以下两种方式:</SPAN> (1) 指针变量初始化的方法</SPAN> int a;</SPAN> int *p=&a;</SPAN> (2) 赋值语句的方法</SPAN> int a;</SPAN> int *p;</SPAN> p=&a;</SPAN> 不允许把一个数赋予指针变量.</SPAN> c.指针变量作为函数参数</SPAN> 函数的参数不仅可以是整型、实型、字符型等数据,还可以是指针类型。它的作用是将一个变量的地址传送到另一个函数中。</SPAN> d.指针变量几个问题的进一步说明</SPAN> 指针变量可以进行某些运算,但其运算的种类是有限的。它只能进行赋值运算和部分算术运算及关系运算。</SPAN> 1. 指针运算符</SPAN> 1) 取地址运算符&:取地址运算符&是单目运算符,其结合性为自右至左,其功能是取变量的地址。在scanf函数及前面介绍指针变量赋值中,我们已经了解并使用了&运算符。</SPAN> 2) 取内容运算符*:取内容运算符*是单目运算符,其结合性为自右至左,用来表示指针变量所指的变量。在*运算符之后跟的变量必须是指针变量。</SPAN> 需要注意的是指针运算符*和指针变量说明中的指针说明符*不是一回事。在指针变量说明中,“*”是类型说明符,表示其后的变量是指针类型。而表达式中出现的“*”则是一个运算符用以表示指针变量所指的变量。</SPAN> 2.数组指针和指向数组的指针变量</SPAN> 一个变量有一个地址,一个数组包含若干元素,每个数组元素都在内存中占用存储单元,它们都有相应的地址。所谓数组的指针是指数组的起始地址,数组元素的指针是数组元素的地址。</SPAN> a.指向数组元素的指针</SPAN> 一个数组是由连续的一块内存单元组成的。数组名就是这块连续内存单元的首地址。一个数组也是由各个数组元素(下标变量)组成的。每个数组元素按其类型不同占有几个连续的内存单元。一个数组元素的首地址也是指它所占有的几个内存单元的首地址。</SPAN> b.通过指针引用数组元素</SPAN> C语言规定:如果指针变量p已指向数组中的一个元素,则p+1指向同一数组中的下一个元素。</SPAN> 引入指针变量后,就可以用两种方法来访问数组元素了。</SPAN> 如果p的初值为&a[0],则:</SPAN> 1) p+i和a+i就是a[i]的地址,或者说它们指向a数组的第i个元素。</SPAN> 2) *(p+i)或*(a+i)就是p+i或a+i所指向的数组元素,即a[i]。例如,*(p+5)或*(a+5)就是a[5]。</SPAN> 3) 指向数组的指针变量也可以带下标,如p[i]与*(p+i)等价。</SPAN> 根据以上叙述,引用一个数组元素可以用:</SPAN> 1) 下标法,即用a[i]形式访问数组元素。在前面介绍数组时都是采用这种方法。</SPAN> 2) 指针法,即采用*(a+i)或*(p+i)形式,用间接访问的方法来访问数组元素,其中a是数组名,p是指向数组的指针变量,其处值p=a。</SPAN> c.数组名作函数参数</SPAN> 数组名可以作函数的实参和形参,如果有一个实参数组,想在函数中改变此数组的元素的值,实参与形参的对应关系有以下4种:</SPAN> 1) 形参和实参都是数组名。</SPAN> 2) 实用数组,形参用指针变量。</SPAN> 3) 实参、型参都用指针变量。</SPAN> 4) 实参为指针变量,型参为数组名。</SPAN> d.指向多维数组的指针和指针变量</SPAN> 如a[0]数组,含有a[0][0],a[0][1],a[0][2],a[0][3]四个元素。</SPAN> 数组及数组元素的地址表示如下:</SPAN> 从二维数组的角度来看,a是二维数组名,a代表整个二维数组的首地址,也是二维数组0行的首地址,等于1000。a+1代表第一行的首地址,等于1008。</SPAN> a[0]是第一个一维数组的数组名和首地址,因此也为1000。*(a+0)或*a是与a[0]等效的, 它表示一维数组a[0]0 号元素的首地址,也为1000。&a[0][0]是二维数组a的0行0列元素首地址,同样是1000。因此,a,a[0],*(a+0),*a,&a[0][0]是相等的。</SPAN> 同理,a+1是二维数组1行的首地址,等于1008。a[1]是第二个一维数组的数组名和首地址,因此也为1008。&a[1][0]是二维数组a的1行0列元素地址,也是1008。因此a+1,a[1],*(a+1),&a[1][0]是等同的。</SPAN> 由此可得出:a+i,a[i],*(a+i),&a[i][0]是等同的。</SPAN> 此外,&a[i]和a[i]也是等同的。因为在二维数组中不能把&a[i]理解为元素a[i]的地址,不存在元素a[i]。C语言规定,它是一种地址计算方法,表示数组a第i行首地址。由此,我们得出:a[i],&a[i],*(a+i)和a+i也都是等同的。</SPAN> 另外,a[0]也可以看成是a[0]+0,是一维数组a[0]的0号元素的首地址,而a[0]+1则是a[0]的1号元素首地址,由此可得出a[i]+j则是一维数组a[i]的j号元素首地址,它等于&a[i][j]。</SPAN> 指向多维数组的指针变量</SPAN> 把二维数组a分解为一维数组a[0],a[1],a[2]之后,设p为指向二维数组的指针变量。可定义为:</SPAN> int (*p)[4]</SPAN> 它表示p是一个指针变量,它指向包含4个元素的一维数组。若指向第一个一维数组a[0],其值等于a,a[0],或&a[0][0]等。而p+i则指向一维数组a[i]。从前面的分析可得出*(p+i)+j是二维数组i行j 列的元素的地址,而*(*(p+i)+j)则是i行j列元素的值。</SPAN> 二维数组指针变量说明的一般形式为:类型说明符 (*指针变量名)[长度]</SPAN> 其中“类型说明符”为所指数组的数据类型。“*”表示其后的变量是指针类型。“长度”表示二维数组分解为多个一维数组时,一维数组的长度,也就是二维数组的列数。应注意“(*指针变量名)”两边的括号不可少</SPAN> 阅读全文>> |
刘翔退赛了,回想当天满怀期望的专注电视时的神情,难过,遗憾,惋惜.....前天还与朋友争论得面红耳赤,第二天刘翔真的出意外了。
喜欢刘翔有太多的理由,他一次又一次的刷新纪录,一次又一次的告诉全世界我们黄种人也可以,这个阳光自信的大男孩在04年的夏天带给全国人民太多太多的惊喜和畅快淋漓。 正因为过去的辉煌让这个才25岁的大男孩承载了太多的期望和压力,看看赛前网上的评论,“刘翔承载了13亿人的期望",看看外国媒体的一篇报道 ‘中国体育总局某官员声称刘翔如果此次不能夺金,那他和他的教练之前取得的一切成绩都是毫无意义的’。 现代奥林匹克之父顾拜旦说过:“在奥运匹克之中,参赛比取胜更重要,只要你参与过,留下纪念,留下回忆,一切物质及名誉都是次要的,重要的是享受这一份经历过的甜蜜”。而现实看来,人们并没有领悟他老人家的金玉良言。一次次在镜头前我们看到最多的永远都是金牌获得者,银牌,铜牌相比之下显得那么黯然失色。08年奥运会让作为观众的我首先为我们国家此次获得这么多骄人战绩感到无比自豪,同时媒体的疯狂报道也让我感受到些许疑惑。似乎参加比赛就要夺第一,否则毫无意义,从来关注最多的就是 |
仙湖、大梧桐、小梧桐、荔枝公园、笔架山公园、大梅沙、南澳、旅游免费景点。 五一期间旅游常备娱乐物品:MP3及耳机 建议:选用乐味耳机“随意揉炼都不会坏” 重点:两个保换,耐用! 五一期间注意:吃、喝、玩、乐不要太疯,小心感冒、禽流感! |
© 2024 Jinbay.com All rights reserved.
版权所有金海湾。 未经许可,不得转载。