指针总结

2024-05-11

指针总结(精选11篇)

指针总结 篇1

如果const在*左边,const修饰值intconst*pi

如果const在*右边,const修饰指针int*constpi;

其实这种问题你可以这样看,const后面如果有*p之类的,就是p能改,*p不能改,也就是指针能改,指针的值不能改,intconst*p后面有*p,所以是*p不能改,int*constp是p不能改,*p能改~!其他的类似。

constint*p;

intconst*q;

int*constr=&i;

1,声明了一个指针p,它指向一个int型的常量,p可以再指向别的变量,但这个int型的值不能被改变

2,同上.3,声明了一个常指针p,它被一个int型变量的地址初始化,这个指针将不再允许指向别的变量,而这个int变量的值是可以改变的。

const修饰指针和引用的用法,对于初学C++的人直是讳莫如深,不知所云.一旦你了解了其用法,一切便不值一哂了.下面我为读者一一释疑:

大致说来其可分为三种情况:const修饰指针,const修饰引用,const修饰指针的引用.1.const修饰指针

const修饰指针又可分为三种情况:

const修饰指针本身

const修饰指针所指的变量(或对象)

const修饰指针本身和指针所指的变量(或对象)

(1).const修饰指针本身

这种情形下,指针本身为常量,不可改变,任何修改指针本身的行为都是非法的.例如:constinta=1;

constintb=2;

inti=3;

intj=4;

int*constpi=&i;//ok,pi的类型为int*const,&i的类型为int*const

int*constpi=&a;//error,pi的类型为int*const,&a的类型为constint*const

pi=&j;//error,指针是常量,不可变

*pi=a;//ok,*pi并没有限定是常量,可变

由此看出,pi是常量,常量在初始化和赋值时,类型必须严格一致。也就是const修饰指针本身时,=号两边的变量类型必须严格一致,否则不能匹配。

(2).const修饰指针指向的变量(或对象)

此种情形下,通过间接引用指针不可改变变量的值,假设指针为p,则*p不可变,下面以例子说明:

constint*pi=&a;

//orintconst*pi=&a;

//两者毫无二致,不过BS喜欢前者,这也没什么技术上的优劣之分,也就是说constint与intconst可以互换.建议大家熟

//悉这两种形式,为简洁便,以后统统用前者.//ok,const并不修饰指针本身,pi对赋值类型

//没要求,但pi是int*型指针,所以所赋的必须是个地址值。

constint*pi=&i;//ok,pi可赋值常量的地址,又可赋变量的地址

constint*pi1=&a;

constint*pi=pi1;//ok

*pi=j;//error,*pi不可变,不能更改指针的间接引用形式

pi=&j;//ok,pi可变

pi=&b;//ok,pi可变

pi++;//ok

--pi;//ok

由此可见,pi是变量,可以赋值常量和变量的值,正如一个整型变量可赋整型数和整型变量一样.const修饰的不是指针本身,而是其间接引用,=号两边的类型不必严格匹配,如:constint*pi=&a;中,pi的类型为int*,而&a的类型为constint*const,只要其中含有int*就可以。又如:constint*pi=&j;中,pi的类型为int*,而&j的类型为int*const,它向pi赋值并无大碍。

(3)const修饰指针本身和指针所指的变量(或对象)

设有指针p,此种情形下,p和*p都不可变.举例如下:

constint*constpi=&a;

//orintconst*constpi=&a;

//将constpi看作一体,就与(2)所述相同,只是要求pi必须为const,正如上所说,=号两边的类型不必严格匹配,但必须含有int*,&a的类型为constint*const,含有int*,所以可以赋值。constint*constpi=&i;//ok,&i类型为int*const,含有int*,可赋值。

constint*pi1=&j;

constint*constpi=pi1;//ok,pi1类型为int*

pi=&b;//error,pi不可变

pi=&j;//error,pi不可变

*pi=b;//error,*pi不可变

*pi=j;//error,*pi不可变

pi++;//error,pi不可变

++i;//ok,=号右边的变量(或对象)与所修饰的变量无关

a--;//error,a为const

这种情况,跟以上两种情形有联系。对constint*constpi=&a;我们可以这样看:constint*(constpi)=&a;(仅仅是表达需要),将constpi看作一体,就与上述分类(2)符合。只要含有int*便可.2.const修饰引用

这种情况比较简单,没有象修饰指针那样繁复,因为引用和引用对象是一体的,所以引用被const修饰只有一种类型。

const修饰引用,引用本身不可变,但引用的变量(或对象)可以改变.例如:

constint&ri=a;//orintconst&ri=a;ok,ri本身是常量,引用不区分类型

constint&ri=i;//ok,引用不区分类型

ri++;//error,ri为常量,不可变

i++;//ok,=右边的变量与引用无关

ri=b;//error,ri为常量

i=j;//ok,=右边的变量与引用无关

int&constri=i;//error,不存在这种形式,没有意义

3.const修饰指针的引用

引用只是个别名,这里与修饰指针类似,又分为三种情况:

(1)

先给个例子:

constint*pi=&a;

constint*&ri=pi;

//orintconst*&ri=pi;

引用是引用对象的别名,正因为如此,ri是pi的别名,所以ri的类型必须与pi完全一致才行。这里pi的类型为int*,ri的类型也为int*,赋值可行。若constint*&ri=&a;正不正确?分析一下就知晓。ri类型为int*,&a的类型则为constint*const不匹配。

constint*&ri=&i;//error,类型不匹配,一为int*,一为int*constri=&a;//ok

ri=&i;//ok

constint*pi1=&a;

constint*pi2=&i;

ri=pi1;//ok

ri=pi2;//ok

*ri=i;//error

*ri=a;//error

注意这与1-(2)的区别.(2)

用例子说明:

int*const&ri=&i;

去掉ri左边的&号,则为int*constri,因为ri是别名,故ri的类型应与赋值的数类型一致,ri类型为int*const,&i为int*const,可以这么做.int*const&ri=pi;//error,类型不合,一为int*const,一为int*int*const&ri=&a;//error,类型不合,一为int*const,一为constint*const

(*ri)++;//ok

i++;//ok

ri=&i;//error

这种情况下,ri为常量,不可更改.(3)

用例子说明:

constint*pi=&j;

constint*const&ri=pi;//orintconst*const&ri=pi;ok

constint*const&ri=&i;//ok

ri是pi的别名,pi的类型应与ri一致。拿掉&,得constint*constri,把constri看作一体,很容易得出ri的类型信息,就象前面2-(3)所讨论的一样,可以得到赋给ri的只要含有类型int*即可。pi的类型为int*,&i的类型为int*const,可以这么做.constint*const&ri=&a;//ok

ri++;//error

*ri=6;//error

指针总结 篇2

钟表指针 (时针与分针) 夹角问题是初中数学中比较常见而又棘手的问题。教学时, 我们往往采取数形结合的办法先画出图形, 再根据具体的数据, 经过观察容易得出整点、半点时指针的夹角度数。然而, 倘若要求出任意时刻时针与分针的夹角, 比如7点过4分这一时刻时针与分针的夹角, 通过观察就没办法了。能不能用一个公式来解决这一问题呢?答案是肯定的。

【探索讨论】

下面我们来探讨一般性的解决方法:

我们知道, 钟表表面 (如图) 共有12个大格, 每格所对的圆心角为30°, 分针60分钟 (1小时) 旋转一周360°, 每分钟旋转6°;时针60分钟 (1小时) 旋转一格30°, 每分钟旋转0.5°。

现在我们将问题一般化处理:分针走n分钟, 旋转 (6n) °, 时针走n分钟旋转 (0.5n) °。假设12点时指针夹角为0°, 那么m点n分时刻时针旋转了[ (60m+n) ×0.5]°, 而分钟旋转了[ (60m+n) ×6]°, 设m点n分这一时刻时针与分针得夹角为β, 则β=| (60m+n) ×0.5- (60m+n) ×6|°=|330m-5.5n|°。由于330°与30°互为周角, 所以β=|330m-5.5n|°=|30m-5.5n|°。至此, 我们可以求任意时刻钟表指针夹角问题了。不过, 在实际运用过程中需要注意:β有可能大于平角, 而我们所探讨的角一般是小于180°的。如7点过4分这一时刻, 时针与分针的夹角β=|30×7-5.5×|°=188°。这时, 我们要求另一夹角β′=360°-188°=172°。所以, 当所求夹角大于180°时, 就取=360°-|30m-5.5n|°。最后, 我们把钟表指针 (时针与分针) 夹角公式完整表述为:β=|30m-5.5n|°, 当β大于180°时, 夹角是360°-|30m-5.5n|°。其中, m代表小时, n代表分钟。

【实际运用】

时钟是测量时间的工具, 时间的长与短, 多与少都可以通过指针的指向来加以判断, 在几何中, 机械时钟的指针还给了我们角的直观形象, 那么你能求出以下几个时刻时钟的分针与时针的夹角有多大吗?

(1) 3点整; (2) 4点10分; (3) 5点54分; (4) 1点46分

解: (1) 由公式得, β′=|30×3-5.5×0|=90°

(2) 由公式得, β′=|30×4-5.5×10|=65°

(3) 由公式得, β′=|30×5-5.5×54|=147°

(4) 由公式得, β′=|30×1-5.5×46|=223°, 由于我们通常研究的角小于平角, 故取360°-223°=137°。

以上关于时钟指针夹角计算问题的例子是七年级数学新教材中的一个难点, 解题时, 只需机械的运用公式, 难题也就不难解决了!

【牛刀小试】

1、请计算下列各时刻时钟的时针与分针的夹角分别有多大?

(1) 、下午2:15; (2) 、中午11:45; (3) 、晚上9:30。

2、在下列哪一组时刻中, 时钟指针的夹角恰好分别为锐角、钝角、直角和平角? ()

A、2:00、3:00、6:10、6:00;B、2:00、6:10、3:00、6:00;C、3:00、2:00、6:10、6:00;D、6:00、3:00、2:00、6:10。

(参考答案:1、 (1) 22.5° (2) 82.5° (3) 105°;2、B。)

【归纳小结】

张又旭:指针之美 篇3

每天早晨,张又旭都会打开他那只盛满名表的盒子,先欣赏一下他从世界各地搜罗来的“宝贝”;尔后,他会选出一只适合当天心情的表戴上。接受采访那一天,戴在他腕上的是一块十分简约的劳力士。经过短暂的品表、选表程序,张又旭一天的生活宣告开始。

他是中国钟表收藏家的NO.1,中国第一块120万游龙戏凤陀飞轮表的总设计师,嘉士德、苏富比等世界知名拍卖行的VIP客户,家有限量名表数千块。走进张又旭的家,架子上摆放整齐的一排排的紫砂壶,一吧台的品牌名酒,一仓库的不知堆放了多少箱子的稀世烟斗……玩表、玩车、玩摄影,简直是新世纪的老一辈新酷玩家。

早晨“点表”的那片刻宁静,可以为他带来一天的神清气爽。“我喜欢转听表针发出的‘嘁嚓’声,很有生命力。”张又旭说。

机械之美

少年时,张又旭并不喜欢钟表的声音——“闹钟很吵,让入睡不好觉。”家境殷实的他,懵懂中即耳濡目染了好表的定义——劳力士、欧米茄,一定要是高复杂、纯手工、机械表,要求再高点,要有鸣响报时器、日月星盈亏、计时马表、两地时间显示、温度测量器、指南针……单单这些粗浅的认识,已让草根出身的名表收藏家难以望其项背。

随着年龄的增长,张又旭渐渐发现“表是值得尊敬的”。而真正让张又旭领略到“有些表也值得欣赏”的是他的一位至交好友。张又旭形容他的朋友是—位“完美欣赏主义者”,对表颇有研究。朋友对表由衷的喜爱,让他感动。于是,在朋友的影响下,心灵手巧的张又旭开始研究表、收集表、雕刻表、制作表,从此一发不可收拾。

他又是中国最早的名表收藏家。早在1960年,张又旭就从一个落魄的国民党军官手中买下了其藏品中的第一块名表——积架经典的双面表(reverso系列)。

张又旭从不喜欢“花哨”的表。他有自己的收藏原则——“我喜欢经典的东西。所谓经典,就是它拥有特别的生命,你可以赋予它特别的解释。这种东西是旁人无法效仿的。”因此,他不忍放过进入眼中的任何一款经典之作。张又旭曾在意大利买过一只卡地亚表。据说,那款表在整个意大利只有一只。

随着对表钟爱的加深,张又旭不满足于把玩名表的表象,他开始着迷于收集、拆装百年晶牌视之荣耀的独门专属机芯,寻访世界各地、混迹于各大拍卖会,不惜重金购回世界名表大师操刀制作稀世名表的机床,用自己的双手尝试复原、重铸传说中的稀世名表,玩表至此,已臻极致。搭载Zenith最著名的自制EI Primero自动上链机芯,细腻镂刻设计的计时针盘,有着对称且平衡的美感,以极简方式传递复杂制表工艺的上乘技术与质感;限量250只的Mille Miglia系列Split Second双追针计时码表,拥有玫瑰金表壳与追针计时码表功能;体现制表工艺中最精密的运动功能及独特魅力,黑色面盘上的四个定时器,以极动感的方式排列,呈现刚毅的运动线条,独有的奢华、性能与精密特性……年夜时分,一只只精密机芯被张又旭取出,安放在拥有250年历史的劳力士创始人汉斯·威尔斯多夫使用过的工作台上,地道的工具,柔和的灯光,在张又旭的手中,250年前的制表瞬间与此刻重合。

张又旭爱表几近疯狂。为了争得一台挚爱的宝矶大师用过的机床,在嘉士德拍卖专场,张又旭从一开始高举手中的号牌,至落槌仍不曾放下,势在必得的决心可见一斑。时至今日,张又旭专门建了一个仓库,用来存放古董表。里面摆满了箱子,由于藏品数目众多,每个箱子上面都贴着标签,这样他才知道里面放的是什么表。必要时,张又旭要找几个搬运工过来帮他,因为他一个人根本挪不动那些箱子,

在张又旭的藏品中,目前最贵的是从海外购买的PATEK PH,LIPPE(百达翡丽),价国王的珍藏,百达翡丽特制,世界仅此一块,2006年嘉士德拍卖价值1100万美元值一千多万美元,名叫“国王的珍藏”,它是特制的,是世界上唯一的一块。张又旭与国内其他名表收藏家最大的不同是,别人收藏表多多少少把它作为一种投资手段,而张又旭只把它当成一种乐趣,他的名表收藏方式是:只进不出。他不关心纳入囊中的名表升值几许,“因为它们终生属于我了。”面对媒体,他是低调的,他基本不会与人分享自己的藏品,“只图一乐,娱己不娱人。”

在家的时光,他一般都是待在家里,研究些诗词歌赋,看已经没人看的书,发烧一下音响,喝杯红酒,抽抽烟斗,温吞自在。张又旭的朋友很多,不一定和钟表有关系,不分年龄层次,甚至家里的动物(两只藏獒,一只二十多岁双目失明却晚年幸福的狗,一只会说话的有黑色羽毛的鹩哥,一只被鹩哥喊作“乖猫”的白猫,还有两条生长在宽敞鱼缸里的海鱼),都可以说是他的朋友。喜爱而不执迷,不管玩什么,都不玩物丧志,是张又旭的哲学

闲暇之余,要是有人跟张又旭聊起手表,他肯定会如数家珍般地点着各种世界名表,俨然一位鉴赏专家。多年的“品”表经验,使张又旭对诸款名表有着自己的理解,比如,“很多人都会觉得劳力士财大气粗,但它的耐用性、机械的精准度绝对是世界一流的;卡地亚则是一个浪漫的品牌。”

在张又旭所有的“家当”中,没有一只石英表。这是因为他觉得,只有机械表,才能让他领略到钟表大师在创造机械“生命”时的艺术美。在他跟中,世界上最大的钟表商百达翡丽创造的机械表意境最高,“它身上的机械之美最到位”。从机械中领略到美,使张又旭认识到,“如果能将一样东西做得不仅漂亮,而且具有极致的美,那一定会取得成功。”由表而及于工作,张又旭希望自己不仅生产产品,而且还能够创造一种艺术。

哈雷图腾

“那时你会花多少时间和它在一起?”

“一半以上。”这是张又旭脱口而出的答案。

张又旭胯下的铁骑,姓哈,名雷。还在15岁时,张又旭就迷上了这个现在都是时髦玩艺的铁家伙,在一个人的基本工资在40元左右的年代,张又旭花了600元买了一辆老美留在中国的二手哈雷摩托,在当时被称为“异数”。哈雷成了他青春峥嵘岁月的附属,他的标志,他的性格,他生活的大部分。“当时真的非常感动、震撼!是一辆Springer,很古典的,2万美元左右。之后一年多,我就拥有自己的第一辆哈雷了。”无论是出于外形的吸引,还是哈雷本性的召唤,占有它的欲望使得这个高中生激动不已。

“穷人玩车,富人玩表”。一块名表所传达的意义,是“生命讯息的延续”。

哈雷,造就了摩托车中的极品。它的传说,一向伴着叛逆、激情、狂放不羁,始终也脱离不了奢侈、偏执、物质,一路载着热爱“哈雷”的人在自己的路上走走停停。“于我而言,哈雷是生活理念,是追求。它身上有很

多气质,只要你接触,都可以通过‘神交’体会得到。”关于历史情怀的持续,关于叛逆、激情、理想主义,关于哈雷宗教,就好像是神父,能够安抚很多人的灵魂。哈雷让他找到了自己的东西、自己的精神寄托、精神力量和信仰。无论他是什么职业,什么身份,也许都是殊途同归,一样找到哈雷,或者被哈雷找到。

张又旭现在仍会下赛道与20出头的小伙子一较高低,车技了得。现在,他还拥有6辆自己的哈雷,几乎每一款车他都参与了改装设计。他说每一款都是最爰,没有先后之分,因为人的阶段性审美情趣,站在拥有它的那时那刻,都是absolutely perfect!改造投入精力最多的是2003年的一款:黑色的流线车身,流动着燃烧的火苗,看上去像是女人的身体,又像是奔跑中的猎豹。有个性,表达个性,独一无二,这应该也是“哈雷精神”的一部分。他经常与玩哈雷的朋友聚在机场的星巴克,十几辆车排成长队,很引人注目。还有更壮观的,在怀柔的山路弯道上,扭头看见后面的长队,真令人兴奋。他们嚣张、浮夸,是城市的异类,不过自得其乐,根本不在乎路人的评判。哈雷是张又旭的玩伴,开心的时候带着玩伴一起,同事生活。或者说是他的大玩具,拆分、组装、改造、试驾,每一样都新奇,给人惊喜。

像他这样的“腕表大师”,甚至未脱书香的气质,却已然是中国的逍遥骑士。看得出,外形的差别不是关键,重要的在于精神世界,精神不在,不能入伍。他不强壮,无须强壮,瘦弱的身躯一样玩哈雷,体力并不重要,脆弱和强大,事实上是辩证的关系,张又旭天生属于哈雷。因为购买了一辆保时捷911跑车,张又旭得以赴德国保时捷YB_的专业赛道过一把真正的赛车瘾。赛车教练激动地说:“你实在太有赛车天分了……不过,现在还不算太晚。”尽管第一次踏足真正的赛车场地时,张又旭那时已经30岁,但那刻,他真的相信,在赛车运动上,自己有着非比寻常的天赋。

接下来的几年里,搜罗名表之外,张又旭又有了一个新的身份——赛车手,他频繁地飞往欧洲,参加各种赛事。张又旭满意于自己取得的成绩。“第一年参赛,我负担大约20~30万元人民币的参赛费和来回路费、住宿费。第二年,开始不用参赛费。第三年,已经有厂商为我付路费和住宿费请我参赛。”

指针总结 篇4

先看下面的代码,注意看代码中的注解!

#include

#include

usingnamespacestd;

voidprint_char(char* array[],intlen);//函数原形声明

voidmain(void)

{

//-----------------------------段1-----------------------------------------

char*a[]={“abc”,“cde”,“fgh”};//字符指针数组

char* *b=a;//定义一个指向指针的指针,并赋予指针数组首地址所指向的第一个字符串的地址也就是abc�字符串的首地址

cout<<*b<<“|”<<*(b+1)<<“|”<<*(b+2)

//-----------------------------段2-----------------------------------------

char* test[]={“abc”,“cde”,“fgh”};//注意这里是引号,表示是字符串,以后的地址每加1就是加4位(在32位系统上)

intnum=sizeof(test)/sizeof(char*);//计算字符串个数

print_char(test,num);

cin.get;

//-------------------------------------------------------------------------

}

voidprint_char(char* array[],intlen)//当调用的时候传递进来的不是数组,而是字符指针他每加1也就是加上sizeof(char*)的长度

{

for(inti=0;i{

cout<<*array++<}

}

下面我们来仔细说明一下字符指针数组和指向指针的指针,段1中的程序是下面的样子:

char*a[]={“abc”,“cde”,“fgh”};

char* *b=a;

cout<<*b<<“|”<<*(b+1)<<“|”<<*(b+2)<

char *a[]定义了一个指针数组,注意不是char[], char[]是不能同时初始化为三个字符的,定义以后的a[]其实内部有三个内存位置,分别存储了abc�,cde�,fgh�,三个字符串的起始地址,而这三个位置的内存地址却不是这三个字符串的起始地址,在这个例子中a[]是存储在栈空间内的,而三个字符串却是存储在静态内存空间内的const区域中的,接下去我们看到了char* *b=a;这里是定义了一个指向指针的指针,如果你写成char *b=a;那么是错误的,因为编译器会返回一个无法将char* *[3]转换给char *的错误,b=a的赋值,实际上是把a的首地址赋给了b,由于b是一个指向指针的指针,程序的输出cout<<*b<<“|”<<*(b+1)<<“|”<<*(b+2)<结果是>

abc

cde

fgh

可以看出每一次内存地址的+1操作事实上是一次加sizeof(char*)的操作,我们在32位的系统中sizeof(char*)的长度是4,所以每加1也就是+4,实际上是*a[]内部三个位置的+1,所以*(b+1)的结果自然就是cde了,我们这时候可能会问,为什么输出是cde而不是c一个呢?答案是这样的,在c++中,输出字符指针就是输出字符串,程序会自动在遇到�后停止.

我们最后分析一下段2中的代码,段2中我们调用了print_array()这个函数,这个函数中形式参数是char *array[]和代码中的char *test[]一样,同为字符指针,当你把参数传递过来的时候,事实上不是把数组内容传递过来,test的首地址传递了进来,由于array是指针,所以在内存中它在栈区,具有变量一样的性质,可以为左值,所以我们输出写成了,cout<<*array++<

到这里这两个非常重要的知识点我们都说完了,说归说,要想透彻理解希望读者多动手,多观察,熟能生巧!

420){this.width=420}“ alt=”“ />

内存结构示意图!

//程序作者:管宁

//站点:www.cndev-lab.com

函数指针 篇5

指向函数的指针

函数是一组代码的封装体,这组代码在内存中占有一片存储空间,该空间的起始地址存放在以函数名为名的单元的,换言之,函数名就是指向函数的常指针,这有点类似于数组名是指向数组内存空间的常指针。

(1)函数指针的声明和初始化

(2)函数指针使用举例

typedef

为了避免读者对typedef的用法产生误解,前面一直没有介绍typedef的相关内容,介绍完函数指针,来看看typedef的相关内容。

typedef用来给一个已经存在的类型声明一个别名,举一个最简单的例子:

typedef int* int_p; //不要忘记分号

typedef为int* 引入了一个新的助记符int_p,可以在程序中使用int_p声明指向int型变量的指针,如:

int_p pA,pB;

上述代码声明了两个int型指针变量pA和pB,应当注意:typedef不同于编译预处理命令#define,这种不同主要体现在两个方面:

(1)#define是预处理指令,在编译预处理时进行简单的替换,不做正确性检查,不管含义,只是简单的替换,如:

#define PI 3.14

(2)#define结构可以抽象为:

#define A B

通过函数指针将函数作为另一个函数的参数

函数指针的一个功用是把函数地址作为参数传送,以提高函数的通用性和灵活性,如代码7‑10 :

函数指针数组

指向函数的指针还可以组成指针数组,称为函数指针数组,

函数指针数组的使用范例见代码:

(详细内容请参照本书)

返回函数指针的函数

浅谈指针的偏移 篇6

指针是一种类型,通过类型可以声明一个变量并保存一个内存地址,不同类型的指针对保存的地址会有不同的解释,编译器根据指针的类型(对应的偏移量)解引用出相应的数据。

首先在32位程序设计里,指针大小为4bytes,满足2^32 寻址范围。

到底偏移多少:

曾经探究过一个问题,代码如下:

int a[4][2] = { 0, 1, 2, 3, 4, 5 ,7,8 }; printf(“a = %p,a + 1 = %pn”, a, a + 1); printf(“range = %dn”, a + 1 - a);运行结果:

a = 00E7FC58, a + 1 = 00E7FC60

range = 1

问题来了,为何a + 1 - a 不等于8,等于1呢?

汇编代码:

printf(“range = %dn”, a + 1 - a);00035DDF lea eax,[ebp-20h] 00035DE2 lea ecx,[a] 00035DE5 sub eax,ecx 00035DE7 sar eax,3 00035DEA mov esi,esp 00035DEC push eax 00035DED push 3DA54h 00035DF2 call dword ptr ds:[41204h]即,编译器对减去过后的eax进行处理,eax = 8 ,sar eax,3 后eax右移三位编程最后结果1。

思考:

对于指针的操作,编译器是不是早已内嵌完成一套偏移运算呢?

我们来看以下代码:

int a[4][2] = { 0, 1, 2, 3, 4, 5 ,7,8 }; printf(“*(*(a + 0) + 0) = %dn”, *(*(a + 0) + 0)); printf(“*(*(a + 1) + 0) = %dn”, *(*(a + 1) + 0)); printf(“*(*(a + 1) + 1) = %dn”, *(*(a + 1) + 1));输出结果很简单,但是在指针解引用编译器如何处理呢?

printf(“*(*(a + 0) + 0) = %dn”, *(*(a + 0) + 0));00DF5DC5 push eax printf(“*(*(a + 1) + 0) = %dn”, *(*(a + 1) + 0));00DF5DDB mov esi,esp 00DF5DDD mov eax,dword ptr [ebp-20h] printf(“*(*(a + 1) + 1) = %dn”, *(*(a + 1) + 1));00DF5DF6 mov esi,esp 00DF5DF8 mov eax,dword ptr [ebp-1Ch]可见,编译器自动找到了相应的地址并取出了我们需要的元素,内嵌完成了一套寻址的偏移运算,

探究:

以下代码偏移规则是怎样的?

int a[4][2] = { 0, 1, 2, 3, 4, 5 ,7,8 }; printf(“*(a + 0) + 0 = %pn”, *(a + 0) + 0); printf(“*(a + 1) + 0 = %pn”, *(a + 1) + 0); printf(“*(a + 1) + 1 = %pn”, *(a + 1) + 1);结果:

*(a + 0) + 0 = 0060FE1C

*(a + 1) + 0 = 0060FE24

*(a + 1) + 1 = 0060FE28

实质上 *(a ) + m是一个 int* 类型,所以每加1偏移也就是 4bytes。

再来看:

int a[4][2] = { 0, 1, 2, 3, 4, 5 ,7,8 }; printf(“a = %pn”, a); printf(“a + 1 = %pn”, a + 1);结果:

a = 00C7FEA0

a + 1 = 00C7FEA8

实质上a 是一个 int (*)[2]指针,偏移就是 2 * 4bytes。

再来看:

int a[4][2] = { 0, 1, 2, 3, 4, 5 ,7,8 }; printf(“&a = %pn”, &a); printf(“&a + 1 = %pn”, &a + 1);结果:

&a = 00C2F96C

&a + 1 = 00C2F98C

实质上&a是一个 int (*)[4][2]指针,&a + 1也就偏移了32bytes,跨越了一个a[4][2]的长度,

总结:

学通C语言:函数型指针 篇7

int func(const int a, const int b);

那么,此时声明的函数变量add的地址即为这个函数的地址,同时,add的值保存为这个函数的地址,这个特性与数组相似:数组变量与数组变量的地址均为数组的起始地址。而在这个函数声明中,函数类型为int (const int a, const int b)。使用该函数类型来定义一个函数型指针,其方式如下:

int (* fp)(const int a, const int b);   /* 其中,参数列表的参数名a和b可省 */

上述语句将变量func定义为指向类型为int (const int a, const int b)的指针操作符和变量名两侧的小括号不可省,否则其含义大不相同。例如:

int * fp(const int a, const int b);

此时,指针操作符与数据类型int结合为int型指针类型,该语句只是声明了一个fp函数,而非定义一个函数指针。为该函数型指针赋值的方式如下:

fp = func;

被赋值的函数变量的类型必须与fp的类型完全一致,包括其返回类型和每一个形参的类型。否则程序将报错。

注意:函数型指针变量赋值时,左值与右值的类型必须完全一致。

使用函数型指针变量调用函数的方法与使用函数变量类似,得到函数地址后再带上参数列表即可。可以使用下面两种方式来调用函数:

fp(5, 6);

(*fp)(5, 6);

由于fp被赋值为函数变量func的地址,而func的值又等于其地址,所以*fp可以得到func函数的地址。因此,在调用方式上,可以粗略地将两者视为一致(实际上其后台的处理略有不同)。范例14-7演示了如何使用函数型指针来调用函数。

【范例14-7】使用函数型指针来调用函数,实现方法如示例代码14-7所示。

示例代码14-7

01   #include

02

03   int add(const int a, const int b) {         /* 定义add函数 */

04      return a + b;

05   }

06

07   int main(void) {

08      int (*fp) (const int a, const int b);      /* 定义函数指针 */

09

10      fp = add;                        /* 将其赋值为add */

11      printf(“3 + 4 = %d”, fp(3, 4));         /* 使用fp计算+ 4的值 */

12      printf(“3 + 4 = %d”, (*fp)(3, 4));      /* 使用*fp计算+ 4的值 */

13

14      printf(“%p”, add);                  /* 输出add的值 */

15      printf(“%p”, &add);                  /* 输出add的地址 */

16      printf(“%p”, fp);                  /* 输出fp的值 */

17      printf(“%p”, *fp);                  /* 输出fp指向的值 */

18

19      return 0;

20   }

【运行结果】程序运行后,

【代码解析】本程序定义了一个函数指针,并将其赋值为相应类型的函数变量add。

   第11~12行分别使用fp和*fp的方式调用函数,从图14-12的第1~2行中可以看到它们的调用结果是一样的。

   第14~17行输出了add的值和地址、fp的值和指向的值,从图14-12的第3~6行中可以看到它们的调用结果都是一样的。

公司“工作指针”讨论会心得报告 篇8

一个原则:管理以人为本

一个中心:为事业部提供优质服务

一个目标:提升技能,开源节流

一个办法:创新管理

会中则踊跃发言,发表了诸多观点、意见、自己对工作指针的理解,以及以后如何明确自己的工作责职,更好地服务于各事业部,为公司为自己创造更多的价值。会后我心难平静,通过学习讨论工作指针,对指针有了更进一步了解和体味,暗自将自己的工作要点重新规划了一翻。

在讨论会中,大家三言五语地讲到了对指针的理解,部门课室相对的原则要求,如客服朱课的“

1、对于‘工作指针’的理解是‘办法’是以上‘原则/中心/目标’的基础上展开的。

2、目标:为公司创造更多的效益。

3、原则:工作要依照售后服务条例来展开。

4、中心:为市场一线提供优质的售后服务。

5、办法:创新管理,在原则、中心、目标的基础上打破常规,开创思维,对于各项具体工作情况,以最佳方式方法展开。”以及张春的以服务客户为中心等等。不同的部门不同的课室不同的工作岗位对工作指针的都有不同的观点和理解,但不变的是,都是在公司拟定的工作指针下展开的,是工作指针在不同的部门不同的课室不同的工作岗位的深入应用。

总个讨论会印象最深的应该属刘晓丽的“今年全国的经济状况都不容乐观,本人在多彩公司工作了七年,很能体会公司现在所面临的困难,要多站在管理者的角度考虑问题,勇于改进工作方法,工作与工资是否对等自己常常要扪心自问,对于个人要有增值计划”。是呀,如果我们是管理者或是哪天自己当老板开公司,面对危机会如何才能稳定根基?如何制造机会?如何管控下属?如何创造更多价值利益?这一切都值得我们深思。

作为陪伴公司成长的老员工,讲话是很有重量的,但并非是因为是员老级,而是他们长年累月地与公司同步,处处为公司着想,已经对公司产生不可代替的情感,他们的所言是他们的深深体会。这又让我想起了另一位老员工:xxx,他是我身边最亲近的人,对他的生活作息都很了解,所以很自然便会想及他。从恋爱到结婚到生育,体会最深的应该就是:他把公司比家看得还重!自从他入多彩的那刻起,他就把公司当成了自己的家,把工作放在了重心。全年全天二十四小时开机,随时处理公司任何有关水、电、生产设备的疑问、异常和工作。有时三更醒来(特别是水电设备课没安排值夜班时),他经常不在身边,不是处理公司的水电问题了就是跑到晚班车间修机器去了。那会我很生气:为什么不安排别人去修非得自已去?他当时没答我,等第二天气消后告诉我“公司电工从员有限,别人晚上都加了班,很累了,难道我能心安理得地睡在这里么?”我很惊讶他的话,也为他这番话而感动。没有加班费,没有特殊津贴,他依义无反顾地晚上去做白天没做完的事不说,还三更起床动作,与其比,我渺小了很多!经过近三年的生活,原来在我眼里小弟弟般的他是那么的伟大,成熟却平凡。或许正是因为公司许多这样的他,我们的公司迅速成长壮大。“工作与工资是否对等自己常常要扪心自问,对于个人要有增值计划”,无可否认,公司的确存在着工作与工资并不对等现象,或许正是因为如此,壮大中的多彩要实施“减肥”计划,炼成凹凸有致的美丽形态:明确工作目标和职责,大到公司管理层,小至每个员工,每个岗位都要有存在的价值,并取得相应的成绩效益和获得相应的报酬。

作为国内美工课的一个从员,我的主要工作是负责国内所有客户订单包材的设计(包括:彩盒、外箱、说明书,贴纸,底标,丝印,鼠标垫,铝标等相关包材)和协助/完成部分产品包材结构设计。就结合自己的工作,我发表以下对工作指针的理解:1.一个原则——管理以人为本,工作中要明确工作范围,根据客户/事业部要求与实际情况相结合,明确工作重点,合理管控自己的工作。

2、一个中心/目标——提升技能,开源节流。各事业部对包装要求不一致,我们要根据事业部要求/市场需求设计大方得体,或精致简约,与社会、市场、消费者相适用的结构、包材的设计。控制成本,从材质的选用及结构的设计下手。希望公司能请供应商给我们培训交流包装材质及价格问题,公开透明计价方法,使我们对包装材质有更多的认识,提高估价能力,更好服务于各事业部及客户。

3、一个办法——创新管理,对于我的工作来说就是用创新的手段实现创意和管理设计稿件。从平实简约入手,通过视觉突破实现创新设计,正确宣传产品,引导客户购买,创造更多效益。

C指针与malloc,free 篇9

1、如何初始化一个指针

int *pbuff1; 和 int *pbuff2 = NULL;的区别是什么呢

首先,*pbuff1没有初始化指向NULL,也没指向合法的内存。所以*pbuuf1是个野指针。它会胡乱指向一个地址,这是很危险的。当你对野指针进行写操作的时候,没人会知道结果怎样,可能会修改掉程序中其它值。

*pbuff2初始化为NULL指针,表示*pbuff2不指向任何内容,将指针悬空。指针就不会乱指一气了。

2、如何使用一个指针

建议使用前给指针分配空间。一般使用指针的时候就知道需要多大的空间了。

这就用到malloc:

void *malloc(long NumBytes):该函数分配了NumBytes个字节,并返回了指向这块内存的指针。如果分配失败,则返回一个空指针(NULL)

pBuff = malloc(lenAll*sizeof(char));

if(pBuff!=NULL)

{

memcpy(pBuff,buff,8*sizeof(char));

}

这里是先分配一个空间,然后把内存地址指向了pBuff,如果分配成功了,就把接收到buff里的值存放到pBuff指针,

同样初始化unsigned char *pBuff = NULL;

3、如何防止内存泄漏

malloc对应着free:

void free(void *FirstByte): 该函数是将之前用malloc分配的空间还给程序或者是操作系统,也就是释放了这块内存,让它重新得到自由。

注意free到底释放了什么:

free释放的是指针指向的内存。指针变量依然存在,只有程序结束时才被销毁。不过现在指针指向的内容是未定义的垃圾,所以现在指针又成为了野指针。

因此,释放内存后把指针指向NULL,悬空。防止指针在后面不小心又被解引用了。

同时,确认不用这块内存了在free,不要free完了接着使用。

4、补充:

malloc和free是一一对应的,如果你只malloc一次,相应的就要free一次,重复释放是错误的。

malloc()函数的工作机制:

指针总结 篇10

C++笔试中const与指针关系

关键字const在c++编程语言里面有着非常重要的江湖地位,同时也是各大公司笔试题的关注点,

下面简要介绍一下const与指针的关系。    char greeting[]=“hello”;    const char*p=greeting;//定义一个常量数据,而不是指针常量    char* const p=greeting;//定义一个指针常量,而不是定义常量数据    const char* const p=greeting;//定义一个指针常量以及数据常量    注意:const语法虽然变化多端,但是注意一点的`是,如果const出现在星号左边,表示被指物为常量;如果出现在星号右边,表示指针自身是常量;如果出现在星号两边,表示被指物和指针都是常量,    如果被指物是常量,有些程序员会将关键字const写在类型之前,有些人会把它写在类型之后、星号之前。两种写法的意义相同。所以下列两个函数接受的参数类型是一样的:    void f1(const widget* pw);    void f2(widget const* pw);欢迎阅读更多笔试题目:申银万国校园招聘笔试题目中国银行计算机方向笔试题目C++编写算法判断两棵二叉树是否相等

指针总结 篇11

1、在win 8系统中按键盘组合键“WIN+X”打开快捷键菜单后,并选择进入控制面板选项;

2、打开控制面板界面后,选择“硬件和声音”选项,再点击“鼠标”选项;

3、鼠标设置窗口打开后,将其切换到“指针选项”标签,然后在窗口里面选中“显示指针轨迹”,将显示轨迹的长短进行设置,之后直接单击“确定”保存就可以了,

上一篇:学习收获与感悟下一篇:最反常的天气打一成语