关于指针入门的最好的文章

西餐 2020年06月23日

传递指针到函数

传递指针到函数是非常有用的,也很容易掌握。如果我们写一个程序,让一

个数加上5对于销售商来说,看一看这个程序完整吗?:

#include iostream.h

void AddFive(int Number)

{

Number = Number + 5;

}

void main()

{

int nMyNumber = 18;

cout"My original number is "nMyNumberendl;

AddFive(nMyNumber);

cout"My new number is "nMyNumberendl;

//得到了结果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 "nMyNumberendl;

AddFive(nMyNumber);

cout"My new number is "nMyNumberendl;

}

试着自己去运行它,注意在函数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"*pArrayendl;

}

如果让指针指向数组元素中的下一个,可以用pArray++.也可以用你应该能想

到的pArray + 1,都会让指针指向数组的下一个元素。要注意的是你在移动指针

时,程序并不检查你是否已经移动地超出了你定义的数组,也就是说你很可能通

过上面的简单指针加操作而访问到数组以外的数据,而结果就是,可能会使系统

崩溃,所以请格外小心。

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

别是while循环中。

另一个需要注意的是,如果你定义了一个指向整型数的指针:int*

pNumberSet ,你可以把它当作是数组,如:pNumberSet[0] 和 *pNumberSet是相

等的,pNumberSet[1]与*(pNumberSet + 1)也是相等的。

在这一节的最后提一个警告:如果你用 new 动态地分配了一个数组,

int *pArray;

pArray = new int[6];

别忘了回收,

delete[] pArray;

这一句是告诉编译器是删除整个数组而不一个单独的元素。千万记住了。

后话

还有一点要小心,别删除一个根本就没分配内存的指针,典型的是如果没用

new分配,就别用delete:

void main()

{

int number;

int *pNumber = number;

delete pNumber; // 错误 - *pNumber 没有用new动态分配内存.

}

常见问题解答

Q:为什么我在编译程序时老是在 new 和 delete语句中出现'symbol

undefined' 错误?

A:new 和 delete都是C++在C上的扩展,这个错误是说编译器认为你现在的程序

是C而不C++,当然会出错了。看看你的文件名是不是.cpp结尾。

Q:new 和 malloc有什么不同?

A:new 是C++中的关健字,用来分配内存的一个标准函数。如果没有必要,请不

要在C++中使用malloc。因为malloc是C中的语法,它不是为面向对象的C++而设计

的。

Q:我可以同时使用free 和 delete吗?

A:你应该注意的是,它们各自所匹配的操作不同。free只用在用malloc分配的内

存操作中,而delete只用在用new分配的内存操作中。

引用(写给某些有能力的读者)

这一节的内容不是我的这篇文章的中心,只是供某些有能力的读者参考文章及时收录。

有些读者经常问我关于引用和指针的问题,这里我简要地讨论一下。

在前面指针的学习中,我们知道(&)是读作“什么的地址”,但在下面的

程序中,它是读作“什么的引用”

int Number = myOtherNumber;

Number = 25;

引用有点像是一个指向myOtherNumber的指针,不同的是它是自动删除的。所

以他比指针在某些场合更有用。与上面等价的代码是:

int* pNumber = myOtherNumber;

*pNumber = 25;

指针与引用另一个不同是你不能修改你已经定义好的引用,也就是说你不能

改变它在声明时所指的内容。举个例子:

int myFirstNumber = 25;

int mySecondNumber = 20;

int myReference = myFirstNumber;

myReference = mySecondNumber;//这一步能使myReference 改变吗?

coutmyFristNumberendl;//结果是20还是25?

当在类中操作时,引用的值必须在构造函数中设定,例:

CMyClass::CMyClass(int variable) : m_MyReferenceInCMyClass(variable)

{

// constructor code here

}

总结

这篇文章开始可能会较难掌握,所以最好是多读几遍。有些读者暂时还不能

理解,在这儿我再做一个简要的总结:

指针是一个指向内存区域的变量,定义时在变量名前加上星号(*)(如:

int *number)。

你可以得到任何一个变量的地址,只在变量名前加上&(如:pNumber =

my_number)。

你可以用'new' 关键字动态分配内存。指针的类型必须与它所指的变量类型

一样(如:int *number 就不能指向 MyClass)。

你可以传递一个指针到函数。必须用'delete'删除你动态分配的内存。

你可以用array[0]而让指针指向一个数组。

你必须用delete[]而不是delete来删除动态分配的数组。

文章到这儿就差不多结束了,但这些并不就是指针所有的东西,像指向指针

的指针等我还没有介绍,因为这些东西对于一个初学指针的人来说还太复杂了,

我不能让读者一开始就被太复杂的东西而吓走了。好了,到这儿吧,试着运行我

上面写的小程序,也多自己写写程序,你肯定会进步不小的!查看本文来源

鞍山什么医院治疗白癜风
腹股沟静脉曲张症状
产后补气血的药物
友情链接: 最全的天长美食攻略