快速业务通道

C++中指针入门

作者 佚名技术 来源 程序设计 浏览 发布时间 2012-06-30
"<<nMyNumber<<endl;

//得到了结果23吗?问题出在哪儿?

}

问题出在函数AddFive里用到的Number是变量nMyNumber的一个副本而传递给函数,而不是变量本身。因此, " Number = Number + 5" 这一行是把变量的副本加了5,而原始的变量在主函数main()里依然没变。试着运行这个程序,自己去体会一下。要解决这个问题,我们就要传递一个指针到函数,所以我们要修改一下函数让它能接受指针:把''void AddFive(int Number)'' 改成 ''void AddFive(int*Number)'' 。下面就是改过的程序,注意函数调用时要用&号,以表示传递的是指针:

#include <iostream.h>
void AddFive(int* Number)
{
*Number = *Number + 5;
}

void main()
{
int nMyNumber = 18;

cout<<"My original number is "<<nMyNumber<<endl;
AddFive(&nMyNumber);
cout<<"My new number is "<<nMyNumber<<endl;
}

试着自己去运行它,注意在函数AddFive的参数Number前加*号的重要性:它告诉编译器,我们是把指针所指的变量加5。而不并指针自己加5。

最后,如果想让函数返回指针的话,你可以这么写:

int * MyFunction();

在这句里,MyFunction返回一个指向整型的指针。

指向类的指针

指针在类中的操作要格外小心,你可以用如下的办法定义一个类:

class MyClass

{
public:
int m_Number;
char m_Character;
};

接着你就可以定义一个MyClass 类的变量了:

MyClass thing;

你应该已经知道怎样去定义一个指针了吧:

MyClass *thing;

接着你可以分配个内存空间给它:

thing = new MyClass;

注意,问题出现了。你打算怎样使用这个指针呢,通常你可能会写''thing.m_Number'',但是thing是类吗,不,它是一个指向类的指针,它本身并

不包含一个叫m_Number的变量。所以我们必须用另一种方法:就是把''.''(点号)换成 -> ,来看下面的例子:

class MyClass
{
public:
int m_Number;
char m_Character;
};

void main()
{
MyClass *pPointer;
pPointer = new MyClass;

pPointer->m_Number = 10;
pPointer->m_Character = ''s'';

delete pPointer;
}

指向数组的指针

你也可以让指针指向一个数组,按下面的方法操作:

int *pArray;
pArray = new int[6];

程序会创建一个指针pArray,让它指向一个有六个元素的数组。另外一种方法,不用动态分配:

int *pArray;
int MyArray[6];
pArray = &MyArray[0];

注意,&MyArray[0] 也可以简写成 MyArray ,都表示是数组的第一个元素地址。但如果写成pArray = &MyArray可能就会出问题,结果是 pArray 指向的是指向数组的指针(在一维数组中尽管与&MyArray[0]相等),而不是你想要的,在多维数组中很容易出错。

在数组中使用指针

一旦你定义了一个指向数组的指针,你该怎样使用它呢?让我们来看一个例子,一个指向整型数组的指针:

#include <iostream.h>

void main()
{
int Array[3];
Array[0] = 10;
Array[1] = 20;
Array[2] = 30;

int *pArray;
pArray = &Array[0];

cout<<"pArray points to the value %d\n"<<*pArray<<endl;

}

如果让指针指向数组元素中的下一个,可以用pArray++.也可以用你应该能想到的pArray + 1,都会让指针指向数组的下一个元素。要注意的是你在移动指针时,程序并不检查你是否已经移动地超出了你定义的数组,也就是说你很可能通过上面的简单指针加操作而访问到数组以外的数据,而结果就是,可能会使系统崩溃,所以请格外小心。

当然有了pArray + 1,也可以有pArray - 1,这种操作在循环中很常用,特别是while循环中。

另一个需要注意

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号