`
huozheleisi
  • 浏览: 1291727 次
文章分类
社区版块
存档分类
最新评论

vc++学习篇(四)—— 指针

 
阅读更多

今天看了一本关于vc++的书,上面将的是一些简单的代码,以前没有注意以为很简单,在家没有事情可做,就对这些东西重新详细的看了一边,发现有一些问题是需要注意的,比如:指针。以前认为指针很少我能用上,但是现在才发现原来这个东西也是如此的好用,所以在网上找了一些资料,温习一下。

浅析c/c++中的指针

作者: 潘志翔
出处: yesky
责任编辑: 方舟
[ 2001-12-25 09:34 ]

  在学习c/c+过程中,指针是一个比较让人头痛的问题,稍微不注意将会是程序编译无法通过,甚至造成死机。在程序设计过程中,指针也往往是产生隐含bug的原因。下面就来谈谈指针的应用以及需要注意的一些问题,里面也许就有你平时没有注意到的问题,希望能帮助各位读者理解好指针。

一、我们先来回忆一下指针的概念吧,方便下面的介绍

  指针是存放地址值的变量或者常量。例如:int a=1;&a就表示指针常量(“&”表示取地址运算符,也即引用)。int *b,b表示的是指针变量(注意,是b表示指针变量而不是*b),*表示要说明的是指针变量。大家注意int *b[2]和int(*b)[2]是不同的,int *b表示一个指针数组,而int (*b)[2]表示含有两个元素的int指针,这里要注意运算优先级问题,有助于理解指针问题。

  在这里大概介绍基本概念就够了,至于具体使用方法,如赋值等,很多书都有介绍,我就不多说了。

  二、应用以及注意的问题

  1、 理解指针的关键所在——对指针类型和指针所指向的类型的理解

  ①、 指针类型:可以把指针名字去掉,剩下的就是这个指针

  例如:int *a;//指针类型为int *

int **a;//指针类型为int **

int *(*a)[8];//指针类型为 int *(*)[8]


  ②、 指针所指向的类型:是指编译器将把那一片内存所看待成的类型。这里只要把指针声明语句中的指针名字和名字右边的“*”号去掉就可以了,剩下的就是指针所指向的类型。

  我之所以把他们放在第一位,是因为弄清楚他们是学c/c++指针的重点,正确理解他们才能使你打好c/c++的编程基础。

  2、 指针的应用——传递参数。

  其实它可以相当于隐式的返回值,这就比return的方法更加灵活了,可以返回更多的值,看看下面的例子自然就明白了:


#include "iostream.h"

void example(int *a1,int &b1,int c1)

{

 *a1*=3;

 ++b1;

 ++c1;

}

void main()

{

 int *a;

 int b,c;

 *a=6;

 b=7;c=10;

 example(a,b,c);

 cout <<"*a="<<*a<
 cout <<"b="<
 cout <<"c="<
}

输出:*a=18

b=8

c=10


  注意到没有,*a和b的值都改变了,而c没有变。这是由于a1是指向*a(=6)的指针,也即与a是指向同一个地址,所以当a1指向的值改变了,*a的值也就改变了。在函数中的参数使用了引用(int &b1),b1是b的别名,也可以把它当作特殊的指针来理解,所以b的值会改变。函数中的参数int c1只是在函数中起作用,当函数结束时候便消失了,所以在main()中不起作用。

3、 关于全局变量和局部变量的一个问题

  先不废话了,先看看程序:
#include “iostream.h”

int a=5;

int *example1(int b)

{

a+=b;

return &a;

}

int *example2(int b)

{

int c=5;

b+=c;

return &b;

}

void main()

{

int *a1=example1(10);

int *b1=example2(10);

cout <<”a1=”<<*a1<
cout <<”b1=”<<*b1<
}

输出结果:

a1=15

b1=4135

  *b1怎么会是4135,而不是15呢?是程序的问题?没错吧?

  由于a是全局变量,存放在全局变量的内存区,它一直是存在的;而局部变量则是存在于函数的栈区,当函数example2()调用结束后便消失,是b指向了一个不确定的区域,产生指针悬挂。

  下面是对example1()和example2()的反汇编(用TC++ 3.0编译):

example1():

push bp;入栈

mov bp,sp

mov ax,[bp+04];传递参数

add [00AA],ax;相加

mov ax,00AA ;返回了结果所在的地址

.

.

.

pop bp;恢复栈,出栈

ret;退出函数


example2():

push bp;入栈

mov bp,sp

sub sp,02

mov word ptr [bp-02],0005

mov ax,[bp-02];传递参数

add [bp+04],ax;相加

lea ax,[bp+04];问题就出在这里

.

.

.

mov sp,bp

pop bp;恢复栈,出栈

ret;退出函数

  对比之后看出来了吧?ax应该是存储的是结果的地址。而在example2()中,返回的却是[bp+04]的内容,因此指针指向了一个不确定的地方,由此产生的指针悬挂。example1()中,ax返回了正确的结果的地址。

4、 内存问题:使用指针注意内存的分配和边界。

  使用指针过程中应该给变量一个适当的空间,以免产生不可见的错误。

  请看以下代码:
#include “iostream.h”

void main()

{

char *a1;

char *a2;

cin >>a1;

cin >>a2;

cout <<”a1=”<
cout <<”a2=”<
}

输入:abc

123

输出:

a1=123

a2=

Null pointer assignment


  指针指向了“空”。解决办法就是分配适当的内存给这两个字符串。修正后的代码如下:


#include “iostream.h”

void main()

{

char *a1;

char *a2;

a1=new char [10];

a2=new char [10];

cin >>a1;

cin >>a2;

cout <<”a1=”<
cout <<”a2=”<
delete(a1);注意,别忘了要释放内存空间

delete(a2);

}


  到此就能输出正确的结果了。

  分配了适当的内存之后要注意释放内参空间,同时还应该注意不要超出所分配的内存的大小,否则会有溢出现象产生,导致不可预料的结果。

5、 关于特殊的指针——引用

  引用有时候应用起来要比指针要灵活,用它做返回的时候是不产生任何变量的副本的这样减小了内存的占用,提高执行的速度。引用使用起来要比指针好理解,比较直观。当引用作为参数时,不会改变参数的地址,因此可以作为左值。

  下面请看一个例子:
#include “iostream.h”

char ch[5]=”ABCD”;

char &example(int b)

{

return ch;

}

void main()

{

cout <<”ch=”<
example(2)=”c”;

cout<<”ch=”<
}

输出结果:

ch=ABCD

ch=ABcD


  在实际编程过程中,可以灵活地引用或指针,尽量提高程序的可读性和执行效率。

  三、小结:
  
  指针是学习c/c++的重点难点,主要原因是指针较为抽象,不容易理解。使用指针千万要明白让指针指向什么地方,如何让指针指向正确的地方。在深入系统底层之中需要应用到大量的指针,因此需要理解好指针的基本概念,例如:指针类型和指针所指向的类型。平时应该对留心观察,了解程序的工作过程,必要时候可以对程序进行反汇编,加深对指针的理解,这种方法同样适合学别的编程方面的知识。

  四、结束:

  指针的应用是很广泛的,利用指针可以做很多事情,要成为一个好的程序员,必须对指针有比较深刻的了解。写本文的目的在于让大家对指针有更深一层的了解,提高指针的应用能力,内容大都是我在实际编程中遇到的问题。相信能给大家一定的帮助。

以上是网上查找的东西,写的不错,好好看看!


分享到:
评论

相关推荐

    VC++高级界面特效——3

    "VC++高级界面特效——3"可能是一个系列教程或资源集合,专注于介绍如何在MFC (Microsoft Foundation Classes) 或者WinAPI框架下创建复杂的视觉效果。下面我们将详细探讨一些可能涉及的VC++高级界面特效知识点: 1....

    VC++开发BHO插件——定制你的浏览器

    - `SetSite`方法接收一个`IUnknown`指针,通常是指向浏览器对象的指针,通过它可以获取到其他必要的浏览器接口,如`IWebBrowser2`,以便控制浏览器的行为。 2. **BHO注册与加载** - BHO需要在注册表中的特定位置...

    指针式时钟 vc++mfc编程案例 vc课设

    本编程案例——"指针式时钟",就是利用MFC来实现一个模拟真实指针式时钟的程序,对于学习VC++ MFC编程的初学者来说,这是一个很好的实践项目。 在"指针式时钟"的项目中,主要涉及到以下几个关键知识点: 1. **MFC...

    VC++ 2005系列课程(5):指针与对象

    在这个系列课程的第五部分,我们将深入探讨C++中的核心概念——指针和对象,这两个概念是理解和掌握C++的关键。 **指针详解** 1. **指针基础**:指针是C++中的一种特殊变量,它存储了一个内存地址,这个地址指向另...

    关于VC++6.0的小游戏

    《VC++6.0小游戏——探索C++编程的趣味实践》 VC++6.0,全称Microsoft Visual C++ 6.0,是微软推出的一款经典的C++集成开发环境(IDE),它在20世纪90年代末至21世纪初广泛应用于软件开发,尤其在教学领域深受初学...

    VC++,掀起你的盖头来——谈VC++对象模型

    这篇文章旨在揭示VC++对C++对象模型的实现细节,帮助程序员深入理解编译器的工作原理,提高调试和优化代码的能力。 1. **类布局** - **C兼容的结构(struct)布局**:遵循C的内存布局规则,成员变量按声明顺序排列...

    VC++ 2005系列课程(5):指针与对象模型

    在本课程"VC++ 2005系列课程(5):指针与对象模型"中,我们将深入探讨C++编程中的两个核心概念——指针和对象模型。这两个概念是理解C++高级特性,如面向对象编程的关键。下面将详细阐述它们的相关知识点。 首先,让...

    经典vc程序~/vc++

    《VC++经典程序详解——基于VC6.0的编程实践》 在计算机科学领域,Visual C++(简称VC++)是Microsoft公司推出的一款强大的C++集成开发环境,它以其高效、灵活的特点,深受广大程序员的喜爱。尤其对于Windows平台上...

    vc++课程设计实例精编

    《VC++课程设计实例精编》是一份针对学习和复习VC++编程的宝贵资源,它包含了一系列精心设计的实例,旨在帮助用户深入理解和应用VC++技术。VC++,全称Visual C++,是微软公司开发的一款强大的面向对象的C++集成开发...

    VC++入门精讲(全部重点知识点)

    **VC++入门精讲——全部重点知识点** 在深入学习VC++之前,首先需要理解C++的基础,因为VC++是Microsoft Visual C++的简称,它是一个集成开发环境,用于编写C++程序。C++是C语言的增强版,具有面向对象编程(OOP)...

    vc++学习课件

    本"VC++学习课件"针对初学者,旨在帮助入门者理解并掌握C++编程基础以及如何在VC++环境下进行实际开发。"第六章 模板.ppt"特别关注了C++中的一个重要特性——模板。模板是C++中强大的泛型编程工具,允许程序员创建可...

    如何编程VC++和BC++数值分析类库(附CD-ROM光盘一张)——计算科学丛书

    本书不仅涵盖了VC++和BC++的基础知识,还深入介绍了数值分析类库的构建与应用,非常适合对数值计算领域感兴趣的学习者和技术人员阅读。通过本书的学习,读者可以系统地掌握数值分析的基本原理与编程技巧,为后续研究...

    学生成绩管理系统 vc++

    《学生成绩管理系统——VC++实现详解》 在信息技术飞速发展的今天,各种管理系统已经渗透到各个领域,其中教育行业的学生成绩管理系统是不可或缺的一部分。本文将深入探讨使用VC++编程语言开发一个学生成绩管理系统...

    vc++小游戏

    本篇将围绕“vc++小游戏”的主题,深入探讨使用VC++进行游戏开发时涉及的关键知识点。 首先,我们要理解VC++游戏开发的基础——C++编程语言。C++是一种静态类型的、编译式的、通用的、大小写敏感的、不仅支持过程化...

    vc++学生管理系统完整代码(超详细)

    本篇将详细介绍一个基于VC++的学生管理系统,该系统能够完成数据录入、显示、删除和排序等基本功能。通过解析提供的文件内容,我们可以看到系统的核心在于处理两个文本文件——A.TXT(存储学生基本信息)和B.TXT...

    清华大学 VC++教程

    这篇教程主要针对C++和Visual C++(VC++)编程的初学者,旨在帮助他们掌握这门强大的编程语言及其在Windows环境下的应用。C++是一种通用的、面向对象的编程语言,它由C语言发展而来,增加了类、模板、异常处理等特性...

    VC++入门经典-vc入门到精通

    总而言之,《VC++入门经典——VC++入门到精通》这本书将带领你逐步踏入C++的世界,从基础知识到高级技术,涵盖全面,是学习和提升VC++编程技能的宝贵资源。通过深入学习和实践,你将能够运用VC++开发出功能强大、...

    VC++电子教案(详细的例子)

    四、内存管理篇:动态内存与智能指针 理解内存管理是C++编程的重要环节。本部分讲解动态内存分配与释放,以及如何避免内存泄漏问题。同时,会介绍STL中的智能指针,如auto_ptr、unique_ptr和shared_ptr,它们能帮助...

    VC++入门学习与精通讲座

    【VC++入门学习与精通讲座】是一门专为C++初学者设计的课程,旨在帮助学员从零开始,逐步建立起扎实的C++编程基础,并深入理解C++的高级特性和应用。C++作为一门强大的面向对象编程语言,广泛应用于系统软件、游戏...

Global site tag (gtag.js) - Google Analytics