指针的指针

2024-05-08

指针的指针(通用11篇)

指针的指针 篇1

【问题引入】

钟表指针 (时针与分针) 夹角问题是初中数学中比较常见而又棘手的问题。教学时, 我们往往采取数形结合的办法先画出图形, 再根据具体的数据, 经过观察容易得出整点、半点时指针的夹角度数。然而, 倘若要求出任意时刻时针与分针的夹角, 比如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。)

【归纳小结】

将钟表指针夹角问题公式化处理, 使问题轻而易举地得到解决。学生只需记住公式, 就可很快解决问题, 既丰富了学生的数学知识, 又活跃了课堂气氛, 提高了数学课堂效率。当然, 教学时, 不要将问题复杂化, 可以让学生自主探索, 教师只做引导, 不要越俎代庖, 而要让学生在探索过程中感受成功的喜悦, 收到既鱼又渔的双重功效。

移动设备的隐形指针 篇2

今天,与手机交流的方法是在其键盘或屏幕上指点江山。而研究人员们正在开发更加自由无界的移动设备操作方式。

德国波茨坦哈索普列特纳学院的计算机科学教授帕特里克·伯蒂奇(Patrick Baudisch)和他的研究生肖恩·古斯塔夫森(Sean Gustafson)正在开发一个手机的原型界面,无需使用触摸屏、键盘或者其它任何物理输入设备。一枚小型摄像机和附在衣服上的微处理器就能捕捉并分析人们的手势,将每个手势的轮廓送到电脑显示器上。

该设想希望让使用者能经由一个“虚拟界面”来追踪他们手指在空中画出的形状,从而增强手机对话。伯蒂奇和古斯塔夫森制造了一个带有钻头大小摄像头的原型设备,但他们预测在几年内零件就可以缩小,以便制造更小的系统。

通过手势与电脑交流的想法早已不新鲜。索尼公司已经在销售其称作EyeToy的摄像头及软件,能在PlayStation游戏主机上捕捉手势。微软则为Xbox 360游戏主机开发了一套更为复杂的手势感应系统,叫做“诞生计划”(Project Nail)。麻省理工学院的教授帕蒂·梅斯(Pattie Maes)和她的学生普拉纳·米斯特里(Pranav Mistry)开发了一个基于手势的研究项目,叫做“第六感”(SixthSense),采用可穿戴的摄像头来记录个人手势,并用一个小型投影仪在任何表面创建一个临时的显示界面。

伯蒂奇和古斯塔夫森表示,他们的系统比“第六感”简单,所需零件更少,因此可以更廉价。用左手或者右手做出一个L形状,使用者就能“开启”这个界面。这个动作创建了一个二维空间表面,为即将出现的手指轨迹划定边界。伯蒂奇说使用者能利用这块区域来阐述空间情境,例如怎样从一个地方到达另一个地方。“用户在空中开始比划,”他说,“无需设置工作,也不用掏出设备或者手写笔。”研究人员还发现,由于视觉记忆作用,用户甚至可以回到之前的虚拟草稿添加内容或注释。

关于设置和用户研究详情的报告将在2010年10月纽约举行的用户界面软件与技术(User Interface Software and Technology)研讨会上发表。

一款名为“表面”的实验性触摸屏桌面的开发者,微软研究员安迪·威尔逊(Andy Wilson)说,这项成果是未来产品的标志。“我认为当设备被缩减为零一甚至连显示器都没有——的时候,这种技术作为终极想法是非常有趣的。”他说。

指针的学习与应用 篇3

关键词:内存,指针,单星指针,双星指针,动态数组

1 问题提出

C语言程序中指针的广泛使用严重地影响了数据流分析的精确程度[1]。文献[2]使用安全程序的设计和证明框架,为类C语言一个子集设计指针逻辑系统,用推理规则来表达每一种语句引起指针信息的变化情况,以支持程序的安全性验证。文献[4]提出了在C++编程环境中把对象内的指针区别对待的思想。文献[3,5,6]认为教师可以通过抓住数据在内存中的存储和变化这条教学主线来进行指针教学,并给出了一些尝试。

为了区别整数与存储单元的地址,C语言引入了指针数据类型,定义指针变量以便处理存储单元的地址。因此指针变量其实是比较简单的变量,专门用来存放存储单元的地址,通常是变量的地址。当一个指针变量存储了一个变量的地址,就可以通过指针变量来访问该变量的存储单元。

例1:指针变量的定义和用法

2 变量的存储结构

计算机的内存由若干字节组成,每个字节由8位构成,每个字节都有唯一的编号,以便CPU能读写任何一个字节的内容。字节的编号也称地址。

3 指针概念

实体的地址也称指针。指针不能用一般的变量存储,需要用一种特殊的变量来存储,这种特殊的变量就是指针变量。

定义变量必须使用数据类型,定义指针变量使用的就是指针数据类型。在C语言中,数据类型结合一个或多个*来表示指针数据类型。用指针数据类型定义变量时,变量名应放在*后面。

例2:指针变量的定义和用法

下面给出指针的一个重要概念和3个运算符:

(1)在C语言中,如果一个指针变量p存储了另一个变量x的地址,则称p指向x。例2的指向关系如图1所示。

(2)&是取地址运算符,用来取出变量的地址。

(3)*是间接引用运算符,作用于一个指针变量,访问该指针所指向的内存数据。只有指针变量指向了某个变量,才能使用该运算符,否则将引起异常。当指针变量p指向一个变量时,可以用*p代表该变量。

(4)[]是下标运算符,当指针变量p指向一个变量时,可以用p[0]代表该变量。这是把存储空间当做只有一个下标变量的数组来使用。

4 指针类型

基本数据类型、非基本数据类型和函数,都有相应的指针类型,如,int*,int**,char*,char**,int(*)[4],int(*)()等。定义的指针变量用于指向对应的数据类型。简单地说,指针变量只能存储同类型实体的地址,通过指针变量访问实体。

用一般数据类型加*定义的指针变量称为单星指针变量,加**定义的指针变量称为双星指针的指针。指针变量,加***定义的指针变量称为三星指针变量,依次类推。双星指针变量也称为指向

例3:双星指针变量

C语言规定,指针变量的地址,要用更高级别的指针变量来存储。

fpp是双星指针变量,可存储单星指针变量的地址。fp指向a,fpp指向fp。

5 一维数组与指针

如果定义了字符数组c,整型数组a。char c[5];int a[3]。

数组在内存中占据连续的存储单元,每个下标变量占有相同个数的字节。数组名是数组的起始地址,是常量,c[0]的地址可用c表示,为1000,c[1]的地址可用c+1表示。一般地,c[i]的地址可用c+i表示。

a[0]的地址也是a,为2000,a[1]的地址可用a+1表示,a[i]的地址可用a+i表示。

从这里可以看到,指针加1有特殊的作用,是指向下一个下标变量。不能简单地理解为地址加1,地址增加的数量由数据类型决定。

指针加1指向下一个下标变量,也就是下一个存储单元。

访问下标变量有两程方法:

a[i]——下标法

*(a+i)——地址法

另外,还可以定义一个指针变量,指向一个数组元素。如定义一个指针变量p,使它的值等于某一元素的地址,这样*p就是该元素。也可用p[0]代表该元素。

例4:分别用下标法、地址法访问数组元素。

一维数组名是单星指针,而二维数组名不是双星指针。

6 一维动态数组

需要使用一维动态数组来解决某些实际问题。实现一维动态数组需要定义单星指针变量,用来存储所分配空间的首单元的地址。

例5:使用一维动态数组。

7 二维动态数组

在软件开发中经常需要实现二维动态数组,以解决另外一些实际问题。实现二维动态数组需要定义双星指针变量。

例6:一个班有n人,m门成绩,编写程序进行简单成绩处理。

分析:第5行程序pp=(float**)malloc(n*sizeof(float*))先建立一维float指针数组,有n个下标变量,每个下标变量都是指针变量;第8、9、10及11行程序依次建立了n个一维float数组,首单元的地址分别送给了指针数组的各下标变量。每个一维数组有m+1个下标变量,前m个分别用来存一人的m门成绩,最后一个变量用来存该人的平均分。

8 数的存储结构

这里要把内存中的结构读出来,以帮助理解数的存储结构。

例7:显示短整数10和-10在内存中的存储内容。

说明:

(1)用unsigned char指针读取内存字节中的内容,系统不会把首位当符号位进行处理,因而能准确地显示该字节中的每一位内容。

(2)输出结果第3,4行,输出了两个字节的地址和内容(十六进制0和a),由此可知内存中的存储形式如下:

地址:12450531245052

字节内容:0000 0000 0000 1010

(3)输出结果第7,8行,输出了两个字节的地址和内容(十六进制ff和f6),由此可知内存中的存储形式如下:

地址:12450411245040

字节内容:1111 111111110110

这正是-10的补码。

(4)从例7可以看到,整数字节的逻辑顺序与物理顺序一致,属于little endian。

9 结语

文中提出了新的指针概念单星指针、双星指针和多星指针从变量在内存中的结构来引入和介绍指针的概念,通俗易懂,并给出了指针深层应用的例子。

参考文献

[1]刘强.考虑指针别名的过程间分析技术研究.中国科学院研究生院(计算技术研究所),1998.

[2]陈意云,华保健,葛琳,王志芳.一种用于指针程序安全性证明的指针逻辑.计算机学报,2008,31(3):272-280.

[3]顾晓燕.C语言中的指针和指针教学.福建电脑,2008,(1):206,166.

[4]江汉大学学报(自然科学版).2008,36(1):41-43.

[5]陈无兴,段昌盛.教学主线的研究与实践[J].恩施职业技术学院学报,2006,(2).

关于指针的一些总结 篇4

如果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

指针上的奇迹与疑惑 篇5

虽然从规模上看,首届的亚洲国际高级钟表展未达到日内瓦那样庞大的规模,但是也占用了香港会展中心的一万多平米的展区,汇聚了十三家高级制表品牌,在亚洲地区举行如此高规格的表界盛会,还是吸引了业界和消费者的重点关注,这也表明,国际高级钟表展将亚洲视为重点发展地区。同时,区别于日内瓦钟表展最大的不同是,香港的钟表展是对公众开放,用历峰集团亚太区行政总裁Alain Li的话来解释就是:“SIHH展示What we do,而钟表与奇迹重在展示Who we are。”

“我们将此次首届的亚洲高级钟表展名为’钟表与奇迹’,是因为,我们不仅仅带来了手表,还带来了wonder(英语本义中包含‘奇迹’和‘疑问’),既是奇迹,也表明了我们在思考,在疑惑。”在开幕式上,瑞士高级钟表基金会(FHH)(日内瓦)的主席兼执行董事Fabienne Lupo女士的开场白如是说。

其实,早在2004年,同样是9月,以弗朗格·柯罗尼(Franco Cologni)先生为代表的历峰集团在北京市紫禁城入口太庙举办过一场同名的高级钟表品牌展,现场反响相当热烈,因为那毕竟是中国改革开放以来第一次和高级钟表的最亲密接触。

中国式消费

根据瑞士钟表业联合会(Federation of the Swiss Watch Industry FH)提供的数据表明,2011年以前,除2009年金融危机时期外,瑞士表对中国的出口额每年都有超过40%的惊人增长,中国内地游客常常光顾的香港和新加坡市场,也都保持着两位数字的年增长。直到2012年上半年,瑞士表对中国大陆市场的出口仍有16%的增幅。

然而自去年开始,情况发生了变化。中国自2012年10月1日起禁止政府机构购买奢侈品。里昂证券亚太市场消费研究部门的负责人费舍尔说,这些反腐措施将限制人们在商业环境下送奢侈品。

而在此之前,8月份被網友曝光的有多块名表的陕西安监局局长杨达才,被指其手表多数为瑞士制造。美国彭博社的报道指出,同一时期,瑞士表在中国市场的销售额陡降。去年下半年,瑞士表在中国市场出口额大跌,将上半年的增长归零,导致当年瑞士表对中国出口额接近停滞。这在中国自2003年成为瑞士表主要市场以来的十年中极为罕见。

按照人均GDP计算,中国花在瑞士手表上的钱是美国的6倍,是法国的2倍,这部分是因为送礼有助于与中国政府机构和其他企业打交道。德国证券公司MainFirst的分析师艾费特说:“因此,经济放缓、房地产不景气和政府换届给很多公司的经济情况带来压力。”

今年的情况并没有好转。根据《纽约时报》中文网今年4月的报道,众多钟表企业近年来在中国开设了成百上千家店铺之后,其中一些现在正面临商品滞销,开始减少它们的零售店面。就在这些企业缩小经营规模的同时,中国从世界领先的钟表制造中心瑞士进口钟表产品的数量也在下滑,低于两年前的水平。在2012年,中国曾在这方面创下记录。

“中国的淘金热已经结束了,”瑞士钟表企业爱彼(Audemars Piguet)的首席执行官弗朗索瓦-亨利·本纳明(Franois-Henry Bennahmias)说。爱彼公司已经关闭了它在中国22家零售店中的6家。“我们将会放慢在中国的发展,每走一步都会更加小心。”

根据瑞士钟表业联合会公布的数据,今年第一季度,出口中国大陆的瑞士手表相比一年前的水平降低了26%,为3.23亿瑞士法郎(约合21亿元人民币)。向香港的出口跌了9%,跌至9.1亿瑞士法郎。但总体来说,瑞士手表第一季度的出口上升了2.3%,达到47.3亿瑞士法郎,主要是得到了中东和一些欧洲市场的支持,特别是德国和英国。

另一条出路

这其中,一个非常关键的点不容忽视。当我们谈论中国市场的消费和趋势,一股非常强势的中国游客的海外消费力,无法回避。咨询公司麦肯锡(McKinsey)去年12月份发布的研究报告显示,中国人购买奢侈品的行为约有一半发生在大陆以外地区。因此,“如今巴黎的50平米店铺会远比在中国的50平米店铺有意义。”爱彼的本纳明说。

根据另一家咨询公司贝恩(Bain)同期发布的研究报告,这种市场调整发生的同时,中国消费者购买奢侈品的投入已增加至全球总额的25%,美国消费者的购买比例为20%。世界最大手表公司斯沃琪集团(Swatch Group)的首席执行官尼克·哈耶克(Nick Hayek)说,中国市场出现某种形式的降温是不可避免的。“你无法在一个市场做到每年30%的增长。”他说。但是他也指出,最高端品牌面临的形势有别于“在中低端市场仍然存在的真正增长机遇”。

总部位于日内瓦的手表企业康斯登(Frédérique Constant)的荷兰籍股东彼得·斯塔斯(Peter Stas)认同这一结论,他说:“在中国,那些典型的用于送礼的手表现在真正遇到了问题,但是中产阶级还在购买。”尽管中国零售市场近来出现令人不安的形势,世界上的大型手表和奢侈品集团还在继续强劲增长。“在中国的业务很糟糕,说实话,中国的手表行业在萎缩。”路威酩轩集团手表和珠宝部门的负责人弗朗切斯科·特拉帕尼(Francesco Trapani)说。“政府正从道德角度劝说人们,限制开支,限制展示奢侈品。”但特拉帕尼补充说,“同样真实的是,我们在中国境外出售给中国人的产品数量现在有了显著增加。”

苏黎世冯托贝尔银行(Bank Vontobel)的手表行业分析师勒内·韦伯(René Weber)说,近期手表出口的下滑显示出,需要大量减少在中国的库存。但他也预测,在2013年下半年,一旦中国的库存减少,瑞士手表行业的出口会有所反弹。

但手表零售行业面临的挑战不只是管理多余库存。“在许多中国城市,房租已经涨到了惊人的水平,这意味着,很多零售店已无利可图。”在中国地区销售瑞士手表的公司Swiss Prestige的创始人、驻香港的英家富(Emil Klingelfuss)说。

就在欧洲经济一片萧条之时,手表店的老板们向大量的中国游客张开了欢迎的双臂。“中国人会买各种表,多数人在进店之前已经知道他们需要什么了。”罗马康多提大道上的表行安杰莱蒂(Angeletti)的老板马尔切洛·安杰莱蒂(Marcello Angeletti)说。

“近些年,很多品牌都对中国非常着迷,所以一些公司现在可能要略微减少对中国市场的投入。”另一家瑞士手表公司罗杰杜彼(Roger Dubuis)的首席执行官让-马克·蓬特儒(Jean-Marc Pontroué)表示。

一些手表公司却丝毫不减它们在中国市场的扩张之势,包括香港在内的中国市场在第一季度依然占瑞士手表出口的26%。“我们在中国开设了很多销售点,可能有点儿太多了,但你必须把门店的存在和它的业绩分开,因为门店是一种沟通工具,是不可取代的。”伯爵(Piaget)的行政总裁麦振杰(Philippe Léopold-Metzger)说。伯爵是历峰集团的子公司。

启蒙见面会

回到香港的国际高级钟表展“钟表与奇迹”,从该展会面临更广泛的参展群体就可以看出,首届亚洲国际高级钟表展的目的在于展示和教育,同时,FHH执行董事法比耶娜·卢波(Fabienne Lupo)称:“展览面向整个地区,大中华区、台湾地区、新加坡、马来西亚、菲律宾、韩国和澳大利亚均获得了邀请。”她强调,“展览的目标是亚洲地區,并不以中国为重点。”

法比耶娜·卢波进一步解释:“SIHH是贸易展览会、专业展览会,它仍将每年1月在日内瓦举办,因为它是高档钟表业的摇篮。但SIHH的参展商委员会认为现在应当组织另一场展览或活动,将重心主要放在顾客、收藏家和鉴定行家上。”她说:“这场展览更像是高级钟表业的教育平台。“

因此,在香港展会的现场,我们见到的更多的是,几乎各大品牌都带来了自己的制表大师,现场展示制表的过程和技艺。会场上大量出现的视频材料,让参观者更加近距离地了解瑞士钟表品牌,另一方面,品牌们都大打自己的“历史牌”,强调自己背后所代表的悠久历史和品牌文化。让会场更加像启蒙会的,就是一场名为“征服时间”(The Mastery of Time)的小型原创展览,由瑞士高级制表基金会(FHH)发起,引用了著名历史学家Dominique Fléchon的同名书籍为题,展览里以实物的形式还原了人类计量时间的历史。

C++中的指针的解析 篇6

因为地址指示了字节在存储器中的位置,所以地址也被形象地称为指针。指针是一个存储单元的地址值,用来存放地址(即指针)的变量称为指针变量,常常将指针变量简称为指针。C++中的指针按照它所指向的对象可以划分为变量指针、数组指针、函数指针、对象指针、类的数据成员指针和类的成员函数指针。

一、变量的指针

1. 设type代表任意一种基本说明符,则:

type x;//声明了一个type型变量x。

type*p;//声明了一个type型指针变量p,“*”表示声明的p是一个指针变量,p所指向的变量的类型是type型。

p=&x;//指针变量p指向了变量x,&是地址符号,&x表示变量x的地址。只有变量x的数据类型和指针变量p所指向的变量的数据类型相同才可作此操作。

2. 可声明多级指针变量,如:

type**p;//声明了一个指向type类型的二级指针变量p。

二、数组与指针

1. 数组的指针

type a[3];//声明了一个具有三个type类型数据的数组。

在这里a有两个涵义:

①作为数组名,表示数组这个整体。

②表示这个数组在内存所占的一段连续的存储单元的起始地址,也就是这个数组中第一个元素的地址,即&a[0]。

type*p;//声明了一个type型指针变量p。

p=a;//将数组的起始地址赋给指针变量,使指针变量p指向数组,相当于p=&a[0]。

2. 数组指针

type(*p)[3];//声明了一个指针p,这个指针指向具有3个的type类型元素的数组。

3. 指针数组

type*p[3];//声明了一个具有三个指针元素的数组,每个元素都是可以指向type类型数据的指针变量

三、函数与指针

1. 返回指针值的函数

函数的返回值可以是整型、浮点型、字符型等基本类型,也可以是指针类型。如:int*f(),则函数的返回值是一个指向整型数据的指针,称这个函数为返回指针值的函数。

2. 函数指针

函数名就是函数的入口地址,函数指针就是指向函数入口地址的指针变量,即存放函数入口地址的变量。

p=f;//将函数f()的入口地址赋给函数指针变量p,即使指针变量p指向函数f(),只能将与函数指针变量具有同类型、同参数的函数名赋给函数指针变量。

四、对象指针

设有一个类A, a和f()分别是类A公有数据成员和公有成员函数,则:

A t;//声明了一个类A的对象t, 则&t是对象t的地址。

A*p;//声明了一个指向类A的指针变量p。

p=&t;//将指针变量p指向了类A的对象t。

用指针p调用对象t的数据成员和成员函数的格式为:p→a;和p→f()。

五、类的成员数据指针

设t是A类的一个对象,a是A的一个非静态type型成员数据,s是A的一个静态type1型数据成员,则:

1.①A∷a的相对指针常量为&A∷a;

②A∷s的物理指针常量为&A∷s。

2.①可以指向A类的type型非静态成员的指针p1的声明格式为:type A∷*p1;

②可以指向A类type型静态成员的指针p2的声明格式为:type1*p2。

3.①使p1指向A∷a的方式为:用&A∷a初始化p1或在声明了p1后向p1赋值;

②使p2指向A∷s的方式为:用&A∷s初始化p2或在声明了p2后向p2赋值。

4.①用p1而不用a来访问t.a的格式为:t.*p1;

②用p2而不用s来访问t.s的表达式为*p2。

六、类的成员函数指针

设t是A类的一个对象,f (FL1)是A类的一个type型非静态的函数成员,g (FL2)是A类的一个type1型静态函数成员,则:

1.①A∷f () 的相对指针常量为A∷f;

②A∷g () 的物理指针常量为A∷g。

2.①可以指向A的非静态type型形参表为FL1的函数成员的指针P1的声明格式为type (A∷*p1) (FL1);

②可以指向A的静态type1型形参表为FL2的函数成员的指针p2的声明格式为:type1(*p2) (FL2)。

3.①使p1指向A∷f()的方式是:用A∷f初始化p1或在声明了p1后向p1赋值;

②使p2指向A∷g()的方式是:用A∷g初始化p2或者在声明了p2之后向p2赋值。

4.①用p1而不用f来访问t.f()的格式为:(t.*p1)(实参表);这里的“*”为指针说明符而不是指针运算符;

②用p2而不用g()来访问t.g()的格式为:p2(实参表)。

指针是C++语言中最难掌握的概念之一,错误地使用指针所带来的后果往往是很严重的,有时甚至会导致系统崩溃。因此,正确使用指针是C++语言学习的重点和难点。

摘要:指针是C++语言中最难掌握的概念之一, 错误地使用指针所带来的后果往往是很严重的, 有时甚至会导致系统崩溃。因此, 正确使用指针是C++语言学习的重点和难点。

关键词:C++指针,地址,解析

参考文献

[1]谭浩强.C++语言程序设计.清华大学出版社.

[2]周正德, 侯正昌.C++程序设计 (第2版) .电子工业出版社.

[3]邓振杰.C++程序设计.人民邮电出版社.

C语言的指针学习法 篇7

关键词:指针,数组,地址,变量

凡是学习过c语言的都知道指针是c的灵魂, 它极大的丰富了c语言的功能。下面这部分内容就我个人认识做如下阐述。

1 指针的出现

我想有很多初学者学习到指针都感觉很难, 下面我就以自己的想法来解释下指针这个特殊的数据类型。基本类型变量大家可能并不难理解, 因为基本类型变量其内部存储了同类型的常量, 事实上指针也是变量, 不过呢, 这个变量和基本变量有点不一样, 不同点就在于基本类型变量内部存储了同类型的常量, 而指针变量内部存储的则是“同类型变量的首地址” (所指向的变量的地址) 。可以给你形象的来描述一下:

int a;/*声明一个基本整形的变量*/

此时, 编译器已经给a分配了连续4个字节的内存空间 (VC++6.0) , 结构如图1。

内存地址是线性编码的, 我们可以很容易的看出a的首地址就是他第一个单元的地址1001。

int*Pointer=&a;/*声明一个指向a的指针Pointer*/

编译器也同样给指针变量Pointer分配相应字节数的内存空间, 如图2

该内存空间里存放1001, 即为变量a的地址。

在程序设计中, 如果存在语句:a=10;直接给a赋值, 我们称为直接访问。

如果使用语句:*Pointer=10;即通过指针变量来赋值, 前面的*是间接运算符号, 意思是求Pointer内部存储地址所标识的内存单元, 也就是a。此时, 该赋值是通过间接访问来实现的。如图3

以上就是指针实现的基本解释, 很多优秀的程序员都说指针是C语言中的精华, 的确如此, 很多优秀的程序员写程序都非常依赖指针, 因为它很方便, 实际上指针所访问的对象是没有限制的, 他可以指向任何类型的变量, 前提是只要我们知道内存地址。因此指针也并不安全, 在开发网络程序的时候, 尽量要少使用指针。

2 指针在数组中的使用

简单的来解释下数组, 数组是“同类型变量的有限集合”。数组在内存中占用连续的内存单元 (地址连续) , 来存储数组中的每一个元素。数组是预先分配好指定长度的内存单元, 供数组元素使用。它并不支持动态内存分配。

下面以字符型数组为例来分析字符指针和一维数组之间的关系。数组名其实就是这一组内存单元的首单元, 它的地址就是整个数组的入口地址;数组名是一个指针, 它的基类型为基本数据类型, 不过在具体操作的时候不允许给数组名重新赋值, 可以把数组名理解为cons Pointer (指针常量) 。在程序中可以这样操作:

即同类型的指针, 完全可以胜任数组名的任务。一点问题没有而且可以运行的很好。当然, 我们可以进一步把代码这样来写:

改成

下面以基本整型二维数组为例来分析指针和二维数组之间的关系。二维数组名也代表二维数组的首地址, 也是一个指针常量, 只是其基类型为数组类型, 称为行指针 (a指向第0行, a+1指向第一行) 。可以把二维数组看做一个特殊的一维数组, 只是每个元素又是一个一维数组而已。在程序中可以这样操作:

/*把二维数组看做一维数组时, 每个数组元素a[0]、a[1]、a[2]又包含一个一维数组, 该一维数组又包含4个元素, 这样a[0]、a[1]、a[2]即成为相应的数组名, 也成为一个指针常量, 其基类型为基本整形;所以可以把a[0]、a[1]、a[2]分别赋给指针数组的相应元素*/

p=a;/*p为行指针, 其基类型为数组类型*/

3 总结

指针本身与指针所指向的变量不是一个单元, 一定要弄清楚指针变量的基类型。一个指针ptrold加上或减去一个整数n后, 结果是一个新的指针ptrnew, ptrnew的类型和ptrold的类型相同, ptrnew所指向的类型和ptrold所指向的类型也相同。

参考文献

[1]C语言初学者入门讲座:<http://www.gshu.cn/detail/0/337.htm>

C++语言中指针的级别 篇8

指针是C++语言中的一个重要的概念, 也是学习C++语言的一个难点和重点。正确而灵活地运用指针, 可以动态的申请和释放内存;方便地访问数组;在函数调用时使主调函数能得到多个改变了的返回值;在设计系统软件时能通过指针直接处理内存地址[1]。编程时应用指针, 可以使程序简洁、紧凑、高效。

指针是有级别的, 指针的级别在定义标识符时就确定的。为了后面的讲述方便, 现将C++中的所有标识符 (不包括关键字和函数名) 分类为普通变量 (0级指针) , 一级指针, 二级指针, 多级指针 (三级以上的指针) 。

例1

多级指针在教材上和实际的应用中基本没有涉及到, 大家只需要有这个概念就行了。其实只要真正理解了普通变量 (0级指针) 、一级指针、二级指针, 多级指针就不难理解和应用;在这里也就不讨论多级指针。

2 指针的级别增加

我们知道, C++中指针间能赋值的一个重要条件是两个指针的级别必须相同[2]。

2.1 定义标识符时增加指针级别

我们用一种数据类型定义一个标识符时, 前面没有加星号“*”并且后面没有加中括号“[]”, 这个标识符就是一个普通变量;它没有指针级别。如果我们定义一个标识符时, 标识符的前面每加一个号“*”或者后面每加一个括号“[]”, 这个标识符的指针级别就增加一级[2]。

程序中的定义iNum时前面没有加星号“*”并且后面没有加中括号“[]”, iNum就是一个普通变量, 是一个0级指针, 没有指针级别;定义ip时前面加了一个星号“*”, 后面没有加中括号“[]”, ip就是一级指针;定义array1时前面没有加星号“*”, 后面加了一个中括号“[]”, array1是一级指针;同理, ipp、array2、ip_ar1和ip_ar2是二级指针。

例2

2.2 使用&增加指针级别

当一个标识符定义后, 使用时我们也能增加它的级别, 其方法就是使用时在该标识符前加一个取地址运算符“&”。在上面的程序中最后一行的程序的错误是因为赋值符号两边的级别不一样, ip是一级指针, iNum是普通变量 (0级指针) ;可以在iNum前面加取地址运算符“&”再赋值给一级指针ip即可;即语句ip=&iNum;没有语法错误。同理语句ipp=&ip;也是正确的。正确的代码如例3:

例3

3 指针级别的降低

当使用标识符时, 标识符的前面每加一个号“*”或者后面每加一个括号“[]”, 这个标识符的指针级别就降低一级。根据前面所讲的知识, 在例1中要完成一级指针ip与二级指针array2的赋值, 如果写成ip=array2;就是错误的;正确的方法之一就是降低array2的指针级别;ip=*array2;或ip=array2[];都是正确的。同理语句iNum_2=*ip;也是正确的。

例4

4 结束语

综上所述, 增加标识符的指针级别有两种方法:第一种是在标识符前面加星号“*”或者后面加中括号“[]”;第二种方法是在使用标识符时在标识符的前面加取地址运算符“&”。降低标识符的指针级别只有一种:在标识符的前面每加一个号“*”或者后面每加一个括号“[]”。本文仅仅对指针的级别进行讲述, 其实指针之间赋值不仅要考虑级别, 还要考虑到赋值符号的左边标识符。当必须是变量、赋值符号两侧的标识符的数据类型必须相同、赋值符号左边的标识符必须有确定的值等等条件。特别是将二维数组名的值赋给二级指针变量, 不仅要求二级指针变量能确定它所指向二维数组的列宽, 而且要求二级指针变量所指的一维数组的元素个数与二维数组的列宽是否相等, 两者缺一不可。

摘要:指针是C++语言学习中的重点, 也是C++语言学习中的一个难点。透彻的理解和灵活运用指针是每个C++编程者的终级目标。为了让C++编程者透彻的理解和灵活运用指针, 该文从指针的级别的角度出发, 结合实例剖析指针。在实际的教学中证明, 这种方法不仅让学生能深刻理解指针, 而且能对指针相关知识融会贯通, 学以致用。

关键词:指针,级别,赋值

参考文献

[1]丛书委员会.C++语言程序设计与案例分析[M].北京:电子工业出版社, 2010.

试析C++中的悬挂指针问题 篇9

1 指针操作超越了变量的作用范围

程序中定义的变量都有自己的作用域和生存期,不同的变量的作用范围是不同的。如果指针变量的作用范围大于其指向的对象,那么对象生存期满后,内存会被释放,指针也就变成了“悬挂指针”。看下面一个案例:

VC++6.0运行结果如下:

分析以上程序:由类B的定义可以看出,指针p的作用范围是整个类,而对象a的范围是Fun2()函数。在主函数执行过程中,当B类对象b调用完Func2()后,对象a也伴随着Fun2()函数内存的释放而释放,指针p也变成了“悬挂指针”。如运行结果所示,指针p的指向位置没有发生变化,但是当调用Fun3()时p所指的位置输出的是随机数。

事实上,指针操作超越了变量的作用范围的问题很难防备,即使再认真的程序员,因一时疏忽都可能犯下这样的错误,造成指针悬挂的问题。这样的错误,编译器无法发现,只有程序员谨慎编程,运用指针时,弄清每个变量的作用范围才能尽可能减少因指针悬挂引起的错误和风险。

2 运算符new/delete的运用

为了能更好、更简单地进行内存的分配和释放,C++使用运算符new和delete。在程序运行过程中,运算符new从称为堆的一块自由存储区中为程序分配一块与类型字节数相适应的内存空间,并将该内存的首地址存于指针变量中。运算符delete用于释放运算符new分配的存储空间,但是指向该内存空间的指针还在,如果不把它指向合法的内存空间或者置空,它就会变成“悬挂指针”,一旦后来被当成合法的指针使用就可能修改或泄露数据,对程序的安全性形成了威胁。

2.1 delete释放内存后产生“悬挂指针”

(1)看下面一个例子

VC++6.0运行结果如下:

分析:执行“delete p;”后指针p的值没变,但是对应的内存已经释放,p已成为“悬挂指针”,所以输出是随机数。

(2)一般都需要在delete语句后加入如下的语句,以避免“悬挂指针”引起的错误:

为了简化代码,可以程序中引入如下的两个模板函数:

注意:将delete p和deletep分开定义。

如果在例2中添加了上面两个函数模板,则只需将delete p;语句改为DeleteP (p);即可避免因使用运算符new和delete形成“悬挂指针”。

2.2 浅复制中的指针悬挂问题

浅复制是指当对象的字段值被复制时,字段引用的对象不会被复制。在C++中,只复制了成员,并没有复制资源,使两个对象同时指向了同一资源的复制方式即为浅复制。如果类的成员含有指针,则类的构造函数一般会用new运算符,相应地,析构函数会使用运算符delete。浅复制会使两个对象的指针指向同一内存区,当对象生命周期结束释放资源时系统调用析构函数,第一次析构后则另一个对象的指针成为“悬挂指针”,第二次析构编译器就会报错。

2.2.1 关于类的赋值运算中的"悬挂指针"问题

(1)类的赋值运算符函数未重载产生“悬挂指针”。在C++中,对于任一类,如果用户没有自定义赋值运算符函数,那么系统将自动地为其生成一个默认的赋值运算符函数。采用默认的赋值运算符函数实现的是数据成员逐一赋值的方法,赋值的结果是两个对象共用同一内存资源,所以采用默认的赋值运算符函数实现的是浅复制。如果类对象的成员含有指针变量,则会出现“指针悬挂”问题。看下面一个例子:

VC++6.0运行结果如下:

且系统报错,弹出如下窗口,如图1所示。

分析上面结果:程序开始运行时,创建对象s1,s2时,分别调用构造函数,通过运算符new分别从内存中动态分配一块空间,字符指针ptr指向内存空间,这时两个内存空间中的字符串分别是“flower”和”tree”,如图2(a)所示。调用构造函数后在屏幕上显示两行“Constructor called。”执行语句s2=s1;”时,因为没有用户定义的赋值运算符函数,于是就“调用默认的赋值运算符函数,使两个对象s1,s2的指针ptr指向new开辟的同一个内存空间,这个动态内存空间中的字符串为“flower”,如图2 (b)所示。主程序结束时,对象逐个撤销,先撤销对象s2,第一次调用析构函数,先在屏幕上输出“Destructor called.flower”,接着用运算符delete释放动态分配的内存空间,如图2 (c)所示:撤销对象s1时,第二次调用析构函数,尽管这时s1的指针ptr存在,但其所指空间已被释放,所以它就变成了“悬挂指针”,所指空间因为无法访问,所以屏幕上就出现了“Destructor called.葺葺葺葺葺”,指针ptr所指的字符被随机字符取代。由于第二次析构函数中的语句“DeleteParray (ptr);”企图释放同一内存空间,从而导致对同一内存空间两次释放,这当然是不允许的,必然引起错误,所以有图1所示的错误提醒。

(2)重载赋值运算符“=”来解决指针悬挂问题。为了解决浅复制出现的问题,须显示定义一个赋值运算符重载函数,使之不但给数据成员赋值,而且为s1,s2分配自己的内存空间资源,这就是所谓的深复制。修改后的程序如下:

修改后的程序就不会产生上面的问题了。因为已释放掉了旧区域,又按新长度分配了新区域。

VC++6.0运行结果如下:

2.2.2 关于类的复制构造函数的“悬挂指针”问题

与默认赋值运算函数相似,默认构造函数完成的也只是浅复制,这在很多时候都能满足需要,但也不总是适用。当类的数据成员有指针变量时,浅复制将会引发指针悬挂问题。这种状况同样也要深复制来解决。

(1)未定义类的复制构造函数产生“悬挂指针”。在C++中,采用默认的复制构造函数只是将两个对象的对应的数据项简单复制,两个指针变量也具有相同的值,也就是说两个指针指向的是同一个内存地址,表面上完成了复制,但是并没有形成真正的副本。当对象析构后,就形成了“悬挂指针”。看下面一个例子:

VC++6.0运行结果如下:

并且也弹出了如图1所示的窗口。

分析程序,语句“s2 (s1);”用s1对s2初始化,要调用复制构造函数,因为没有显式定义复制构造函数,所以调用默认的复制构造函数,完成的只是“浅复制”。s2的ptr指针也指向的是存储s1的字符串的内存位置。主程序结束时,对象逐个撤销,先撤销对象s2,第一次调用析构函数,先在屏幕上输出“Destructor called.apple.”,后面的分析同例3,这里不再赘述。浅复制的过程如图3所示。

(2)自定义复制构造函数来解决指针悬挂问题。为了解决这个问题,用户需要自定义一个复制构造函数,使之不但完成数据成员的复制,而且为s2分配自己的内存空间。修改后的程序如下:

修改后的程序就不会产生上面的问题了。因为按长度分配了新区域。

VC++6.0程序运行结果如下:

3 结语

指针的使用很容易产生一些像“悬挂指针”这类让编程者苦恼的问题,但其具有的灵活、方便的特点使它在C++中仍然具有旺盛的生命力。编程者在编程时应规范书写,清楚不同变量的生命周期,用delete释放指针指向的空间后应将指针指向合法地址或者置空,对于容易因浅复制而出现指针悬挂的情况应该采用深复制减少“悬挂指针”的出现。当然,本文只是对“悬挂指针”进行了简单的分析和探讨。在实际应用中,情况更为复杂,还需要程序员保持严谨的编程态度,养成良好的编程习惯。

参考文献

[1]Bjarne Stroustrup.The C++Programming Language,Special Edition[M].北京:高等教育出版社,2000.

[2]谭浩强.C语言程序设计[M].2版.北京:清华大学出版社,2008,11.

[3]郑莉,董渊,何江舟.C++言程序设计[M].4版.北京:清华大学出版社,2010,7.

[4]陈维兴,林小茶.C++面向对象程序设计教程[M].3版.北京:清华大学出版社,2009,6.

洞察中国汽车消费者的指针 篇10

互联网发展到今天,它的功能的确不再仅仅是信息的发布了,一些微博,博客,SNS这些社会化媒体的出现,它加强了互联网社交的属性,开始汽车消费者他们的行为发生了深刻的变革。

互联网的发展渗透在各行各业中,对企业行业也不例外,甚至起到了颠覆性的作用,互联网社会化的传播正在深刻改写汽车行业商业规则。其根本原因在于消费者在汽车生活中的各个环节(了解车、看车、选车、买车、用车、分享/投诉)都在被互联网深深地影响和改变着。

据相关数据统计,截至2011年6月,中国互联网用户数达到4.85亿 ;截至2011年11月新浪微博用户规模为2.5亿;86.7%的消费者购车决策最主要的信息来源是互联网;350万互联网汽车相关活跃自媒体人数……

从这组数据中可以看出,受到互联网影响的消费者的数量规模已经达到一个不容忽视的程度。从我们对2010年和2011年广州车展的研究中可以看出,在线观众的数量已经达到现场观众数量的80倍,而且在线的观众他们会对车展上的事件进行广泛的传播。

关于如何选车,我们有一个概念,就是叫意见领袖。像在爱卡汽车网别克汽车论坛,就有一个意见领袖,他记录了自己在购买和使用过程中一系列的过程,他也跟网民分享他的体验,他获得了26万辆的浏览量。可以看出在互联网的传播过程当中,每个样本不再是平等的样本了,就是有些关键节点,比如关键领袖他们意见会更大程度去影响其他消费者意见。无论是对正面信息的传达,还是负面信息的释放,他们都会起到巨大的作用,甚至会左右事件的发展方向。

消费者如何用车。当一款新车上市的时候,由于市场缺乏对这款车使用体验的。所以,在公布了价格配置之后,网民最关注的往往是提车贴或作业贴, 而这些作业贴的发布与分享, 会直接影响潜在车主的购买倾向。作业贴的高度关注, 充分体现出了互联网自媒体的影响力。

以上的案例证明互联网的确影响着汽车市场。这个现状对整车市场提出了巨大的挑战,首先我们急需了解我们品牌和竞争对手品牌的特点。我们客户的挑战也就是对我们市场研究行业来说,提出了一个新的课题,首先我们需要去设计与传统的市场研究,完全不同的研究方法。互联网在人类历史上第一次使亿万人群个体的行为变得可记录、可衡量、可分析。线上研究侧重于研究自发行为,不关注人口统计要素。线上研究更注重时效性,研究时间周期更短。

我们的主场已经不仅仅是车展现场,互联网的传播影响力,特别是对热点事件,已被在线上急剧地放大。网民已不仅是简单的观众或受众,本身也成为热点信息的传播者。

在互联网的传播与对话过程中,每一个个体不是简单平等的样本,关键节点,如意见领袖,或社会公众人物,会产生巨大的影响力。无论是对正面信息的传达,还是负面信息的释放,意见领袖都可以取得强大的推动作用,甚至会左右事件的发展方向。

如何维护消费者-投诉与危机。在互联网时代,应对危机,网络的反馈时间短到若干小时,企业的应对速度及应对方案面临巨大的挑战,一旦举措不当,后果将是灾难性的。危机传播的强度,态度变化可以量化衡量,并以天为单位分析趋势并预测事态发展方向,互联网媒体正在广泛而深刻的影响汽车市场。

最后是声誉管理。这块我们是可以对末全网进行二十四小时不断监控,如果危机事件发生的话,我们会在第一时间通知厂商,这个时间不会超过一天。因为在声誉管理有两部分,一个是内容,一个是传播。一个就是你知道发生了什么,另外一个就是在持续监测,这个事件会在互联网上怎样被传播,有怎样的节点,以便厂商去制定一些应对危机的策略。

从局部揭示了互联网对传统商业规则的挑战甚至是颠覆,社会化媒体正在迎来社会化商业变革,这一颠覆的根本驱动力来自消费者行为的改变, 来自消费者汽车生活各个环节的重写。

嘉之道对市场研究行业提出了新的课题。社会化商业应用之间的紧密整合产生日趋复杂的用户行为和前所未有的研究视角SoLoMo三者结合时,可能产生新的数据类别,比如社交信息、位置信息以及二者的交叉;社会化电子商务应用中,推荐信息、好友信息、购买信息 的交叉又可产生新的数据组合;这些新的数据类别与数据组合带给市场研究行业前所未有的研究视角,以及价值巨大的消费者洞察。

对日益复杂的应用与用户行为生成的海量数据进行数据挖掘与即时分析。互联网在人类历史上第一次使亿万人群个体的行为变得可记录,可衡量可分析;从海量数据中提取出有用的信息并进行分析,需要强大、可靠的计算机技术进行数据挖掘;中文语言语义的复杂性,以及对数据分析高即时性的要求,都对我们的研究方法和计算机技术提出了非常高的要求。

网络的发展,对整车厂及行业客户提出了新的挑战。急需知道我们(及我们的竞争对手)的产品、活动、品牌在互联网及社会化媒体上的认知情况。倾听社会化媒体中消费者的声音;与消费者对话,建立深入的品牌联系;整合付费媒体、自有媒体和免费媒体为完整的营销方案;利用网络工具度量、评估营销效果。互联网上对企业或产品不利的言论随时都可能发生,企业如何能在第一时间知晓并控制事态的发展至关重要。

浅谈C语言中的指针 篇11

C语言是使用最广泛的程序设计语言之一,它以功能强大,语言简练,编程灵活等特点为广大程序设计人员所青睐,但对初学者是有一定难度的。尤其是指针,它既是C语言的一个重要特色,又是C语言的重点和难点。正确而灵活的使用指针,可有效的表示复杂的数据结构、动态分配空间、方便引用字符串和数组、在函数调用中获得多个返回值、并且可以直接处理内存地址等等。正是因为指针太灵活,一旦指针使用不当,将会导致程序出错,甚至造成系统崩溃。因此,要编写出正确高效的程序,正确理解和使用指针,以及了解指针使用的常见错误是很有必要的。

2 指针的理解和使用

2.1 指针的理解

理解语言指针的基础就是牢固树立指针就是地址的概念。明确地说,指针常量就是地址常量,指针变量就是地址变量。

我们先来看看指针常量:

1)若a是整型常量,则&a表示是a的地址,因为常量的地址在内存中是固定的,因此,是&a指针常量。

2)对于数组来说,只写数组名表示数组的首地址,而数组在内存中的位置是不能改变的,所以它也是指针常量。

3)对于字符串常量来说,直接写出某一字符串就是表示是该字符串的首地址,这是许多教科书上未能提到的。字符串常量在内存中有固定的位置,字符串常量的地址也属于指针常量。

4)对于某个函数来说,它在内存中的地址也是固定的。这样,函数的地址也属指针常量,在C语言中,函数名可以表示函数的地址。

再来看看指针变量:

指针变量就是地址变量,就是说,它是用来存放某一类变量地址的变量。有此概念以后,我们就容易理解指针数组的元素是用来存放变量地址的。同样,在处理链表、二叉树这类递归数据结构时,相应的结构中应存放其它结点的地址从而形成链接的成员变量,即该成员变量应是地址变量,必须用指针变量来刻画。

对于指针变量来说,C语言提供了“*”运算符,它表示取该变量的内容,而当指针变量是指向某一函数时,这时的“取内容”,应广义的理解,即执行相应的函数。

2.2 指针的使用

在程序中定义一个变量,C语言编译系统就会根据该变量的数据类型,为其分配相应的存储单元,类型不同所分配的存储单元的字节数也是不同的。指针变量是一种特殊类型的变量,定义一个指针类型后,C语言编译系统便会为该指针变量分配一个存储单元,用于存放相应变量的地址。使用该指针变量时,必须保证该指针变量指向一个明确的存储单元,即被赋值。例如:

使用指针时,常常涉及到两个运算符:

1)&:获取存储单元的地址

2)*:获取指针变量所指向的存储单元的内容

例如,&i表示变量i的地址,*p表示指针变量p所指向的存储单元的内容,即变量i的内容为2。

2.3 指针变量的类型

指针变量与一般变量一样,也有类型。指针变量的类型是指针所指向的数据的类型,我们也称指针变量类型为指针变量的基类型。指针变量的基类型不仅仅是指所定义指针变量的类型修饰符,同时还包含该指针变量是对多大的存储空间进行解释。例如:

int*p1,(*p2)[3],(*p3)[2][3];

其中,p1可指向1个int型的存储单元,p2可指向3个int型的存储单元,p3可指向6个

int型的存储单元。因此,p1+1是p1指针向下移动2个字节(基本整型占用2个字节),p2+1是p2指针向下移动6个字节(p2指向3个int型的存储单元,每个存储单元占用2个字节,即3×2),p3+1是p3指针向下移动12个字节(p3指向6个int型的存储单元,每个存储单元占用2个字节,即6×2)。

我们知道可以有下列语句定义指针与数组:

那么把两者结合起来会怎么样呢?

int*pa[3];

是定义成数组呢?还是定义成指针呢?回答这个问题的关键在于运算符的优先级。因[]的优先级高于*,加上括弧后定义变成

int(*(pa[3]));

所以pa究竟定义成什么,只要从内层依次往外层看就可以了。即pa是数组,由三个元素组成,每个元素是指针,是指向int型的指针。综合起来,pa是由三个指向int型的指针所构成的数组。

所以对于一个复杂的定义,我们可以按以下步骤来理解它:

1)根据优先次序,加上必要的括弧,使变量名在最内层。

2)从最内层开始依次往外层看,写上所看到的内容。

如:*—→指向×××的指针

[n]—→有n个元素的数组

()—→返回×××的函数等等

例如,对于int**pp;

1)加括弧int(*(*pp));

2)pp是指针,是指向指针的指针,该指针是指向int型的。

3)所以,pp是指向int型指针的指针。

注意,这时不要被两个*所困惑。pp也只不过是一个指针变量而已。请看下面的操作:如图1:

int i;

int*p;

int**pp;

pp=&p;/*把指向int型的指针变量p的地址放入pp所在的内存单元*/

p=&i;/*把int型变量i的地址放入p所在的内存单元*/

**pp=2;/*把整数2放入变量i所在的内存单元*/

现在我们知道,编绎系统不能区分简单指针和指向数组元素的指针。换句话说,对指针进行操作的时候,对指针指向的具体对象不能加以区分。如上面的pp是指向一个int型的指针变量的,而在下面的例子中,pp就指向了一个指针数组。如图2:

当然还有pp指向其它对象的可能。所以定义了1个指针以后,要记住它究竟是指向一个简单的对象呢?还是指向数组?这就要由编程序者自己掌握了。

再看下面的例子:

int(*pa)[3]:

按我们先前介绍的方法去理解,可知pa是一个指向由三个整型元素组成的数组的指针,通过下面的语句可以对它进行初始化。如图3:

3 指针使用中常见的错误

指针类型有其独特的特点,正确合理的使用可以提高程序的功能,但错误地理解和使用指针,将导致无法想象的结果。下面分析讨论指针使用中常犯的错误。

3.1 指针变量未赋值

指针变量在使用之前必须赋初值,这个初值应该是一个地址量。如果只是定义了一个指针变量而没有为它赋值,此时,指针变量指向的是一个不明确的存储单元。例如:

int*p;

*p=8;/*错误*/

该例中,将10赋值给p指向的存储单元,而p指向哪个存储单元是不确定的。应该改为:

这样指针p就指向了变量a,*p=10,实际上是将10赋值给变量a。或者也可以先调用C语言中的内存分配函数得到相应的存储空间,再将函数返回的首地址赋值给指针变量。即:

因此,对应指针变量一定要保证:先给指针变量赋值,然后再使用。

3.2 指针类型不匹配

在给指针变量赋值时,只能将与指针变量基类型相同的变量的地址赋值给改指针变量。例如:

例子中,指针pa的基类型为int型,指针pb的基类型为float型,只能将int型变量的地址赋值给pa,将float型变量的地址赋值给pb。应改为:

另外,基类型相同不仅仅是指类型相同,还包含系统分配给这种基类型的存储单元的容量也相同。例如:

此例中,p1=a是错误的,原因是p1与a的基类型是不同的,p1的基类型是含有1个int型的存储单元,a是二维数组名,是地址常量,它总共有2行,每行3个元素,因此它的基类型是含有3个int型的存储单元。其中,p2的基类型是含有3个int型的存储单元,p2与a的基类型是相同的,因此可以把a赋值给p2,这样就正确了。所以,在给指针变量赋值时,要考虑基类型是否匹配。

3.3 指针变量所指示的存储单元越界

当指针变量对所指示的存储单元进行操作时,应保证所操作的存储单元应该是已分配给程序的存储单元,不应该越界,否则将会导致严重的后果。例如:

第一个for循环用于给数组a的5个元素赋值,第二个for循环用于把数组a的5个元素输出,看上去好像没错,但输出的结果却是出现了问题,程序中存在严重的错误,原因是程序开始p指向数组a的首地址,当第一个for循环执行结束时,p指向数组a的末尾,因此第二个for循环开始执行时,p指针的值并不是&a[0],而是a+5,其值超过了系统给数组分配的空间,应该在第二个for循环前面加上一条语句:

p=a;

使p指针再重新指向&a[0],这样结果就正确了。

因此,在使用指针变量时,一定要注意指针变量应在系统所分配存储空间使用,不要超过系统分配的空间范围,否则结果是无法预料的。

3.4 指针函数带回的指针不存在

函数的返回值不仅可以是一般的数据类型,还可以为指针类型,这种带回的类型为指针的函数称为指针函数。对于函数带回的指针,这个指针所指示的存储单元应该是存在的,不可以不存在。例如:

max是指针函数,编写该函数的本意是由指针P带回x、y中较大数的地址,但函数max执行完毕,返回主函数main时x、y所占用的存储单元已被释放,而p带回的将是一个不存在的存储单元,这样做显然是不正确的。因此,程序应该改为:

这样修改后,max函数中的指针p带回的则是主函数main中a、b中较大数的地址,就可以正确输出了。可见指针函数中带回的指针应该是主调函数中变量的地址,不能是已释放空间的地址。

4 小结

指针是C语言的重要概念,是C语言的重要特色,它简洁、灵活、高效,但又有风险。正确理解和使用指针,避免常见错误发生,不仅要小心谨慎,还有多编程,多上机调试,弄清细节,发现错误,积累经验。

摘要:指针是C语言的一个重要概念,文章对指针基本概念和使用作了简单介绍,总结了指针在使用过程中常犯的错误,讨论了出错的原因,指出正确使用指针的方法,并阐述了C语言中的指针与数组、函数等结合起来的指针及其应用。

关键词:C语言,指针,数组,函数

参考文献

[1]谭浩强.C程序设计[M].北京:清华大学出版社,1999.

[2]冯博琴等.C语言学习指南[M].北京:北京机械工业出版社,1996.

上一篇:全国俄语专业四级考试下一篇:选课管理系统

本站热搜