第四章 指针 Pointer(入门)

第三章

指针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格式的值,所以这是错误的。

综上所述,在我们遇到一些相如是指针这类的问题的时候,记住,,一定要注意左右边是否是同样的格式。

可笑的小心谨慎,还有从来就不会安全的安全感。

第四章 指针 Pointer(入门)

相关文章:

你感兴趣的文章:

标签云: