第三章
指针Pointer
我第一次上网求助,就是在pointer方面遇到了问题,对于我本人来说,有些时候reference和de-reference,address、location、value经常会弄混的,就连我的教授都自己坦言,不仅C++的初学者都会在pointer方面遇到这样那样的问题,而且一些从业多年的编程大神也会遇到指针上面的问题。
有一个笑话,当你学会了指针才能懂:
一个编程的人刚刚完成了一个项目的编程,但是有一个bug总是出现,在他苦苦思索之时,平时打扫卫生的保洁阿姨在旁边说:“小伙子啊,泄漏了”。
在这里我们引入三个新的概念:
Anewkindoftype:reference(alsocalled“address”).
Anoperator(&)toacquiretheaddressofavariable
Anoperator(*)tousetheaddressofavariable
举个例子inpseudocode
IntegermyNum←7
print"thevaluestoredinmyNumis",myNum
print"theaddressofmyNumis",&myNum
这时候,第二行数字将会显示一串数字,那么这段数字就是address
IntegermyNum//Thisdeclaresaninteger
refToIntegermyNumPtr//Thisdeclaresapointertoaninteger
当我们每当用到一个variable前,首先要declare这个variable的type和名称
IntegermyNum
refToIntegermyNumPtr
myNum←7
myNumPtr←&myNum//ThisputstheaddressofmyN
//intothevariablemyNumPtr
在这种情况,myNumwillcontain7,whilethethevariable
myNumPtrwillcontain4683953(orwhateveraddressisgiventothevariable)。在这时,address不一定会是这个数字。
当在赋值之前,这个pointer是garbage
Avalidpointercontainstheaddressofsomedata.
Thepointer"pointsto"thedata.
Followingthepointeriscalled"de-referencing"thepointer.
Problem:dereferencinghas2relatedbutdistinctmeanings.
Torefertothevaluestoredattheaddress(foruseinnormal
calculations)
Toallowstorageofdataattheaddress(foruseinassignment
Statements)
那么现在我们想从一个pointer这里得到一个数字
IntegermyNum←7
refToIntegermyNumPtr←&myNum
print"thevaluestoredinmyNumis",myNum
print"thevalue,again,is",*myNumPtr
myNum←*myNumPtr+1//Payattentiontothisline
*myNumPtr的意思就是dereference,就是从一个pointer的address中读出其中的实际含义。
在上面的例子中,我们已知:
refToIntegermyNumPtr是一个指向integer的指针
myNumptr是一个address
*myNumPtr是一个value,whichcontaininaddress,就是7
7+1等于8
然后*myNumPtr的值不变,给myNum重新赋值。
另一个例子:
IntegermyNum←7
refToIntegermyNumPtr←&myNum
*myNumPtr←*myNumPtr+1//Payattentiontothisline
在这里:
myNum是一个integer,值为7
myNumptr是一个pointertoainteger,//他的值会是一段地址的代码,并没有实际含义//,并且将myNum的地址复制给myNumPtr。
所以这时候,*myNumPtr的值为7
然后是*myNumPtr的自加,所以这时候*myNumPtr将会是8
然而,myNum的值还是7
记住一点,AoperationB时,A和B总会是一样的type(除非有强制转换格式)所以说,在一般的判断的时候,首先先检查一下“=”和“==”左右两边是否为同样的格式。
假如说
1:
myNumPtr=1;
这时候,我们知道myNumPtr是一个pointer,他的值是一个address多半是一串数字,而赋值符号右边是一个integer1,所以这是错误的。
2:
*myNumptr=&myNum
这时候,赋值等号左边是一个值,一个指针所指的一个value,而右边是一个address,所以这也是错误的
3:
Inta=‘a’;
这时候,赋值左边是一个integera,我们要给a赋值,所以只能是一个integer,而赋值等号的右边,是一个char格式的值,所以这是错误的。
综上所述,在我们遇到一些相如是指针这类的问题的时候,记住,,一定要注意左右边是否是同样的格式。
可笑的小心谨慎,还有从来就不会安全的安全感。