第三章
指针 Pointer
我第一次上网求助,就是在pointer方面遇到了问题,对于我本人来说,有些时候reference和de-reference,address、location、value经常会弄混的,就连我的教授都自己坦言,不仅C++的初学者都会在pointer方面遇到这样那样的问题,而且一些从业多年的编程大神也会遇到指针上面的问题。
有一个笑话,当你学会了指针才能懂:
一个编程的人刚刚完成了一个项目的编程,但是有一个bug总是出现,在他苦苦思索之时,平时打扫卫生的保洁阿姨在旁边说:“小伙子啊,泄漏了”。
在这里我们引入三个新的概念:
A new kind of type: reference (also called “address”).
An operator (&) to acquire the address of a variable
An operator (*) to use the address of a variable
举个例子in pseudocode
Integer myNum ← 7
print "the value stored in myNum is ", myNum
print "the address of myNum is ", &myNum
这时候,第二行数字将会显示一串数字,那么这段数字就是address
Integer myNum // This declares an integer
refToInteger myNumPtr // This declares a pointer to an integer
当我们每当用到一个variable前,首先要declare这个variable的type和名称
Integer myNum
refToInteger myNumPtr
myNum ← 7
myNumPtr ← &myNum // This puts the address of myN
//into the variable myNumPtr
在这种情况,myNum will contain 7,while the the variable
myNumPtr will contain 4683953 (or whatever address is given to the variable)。在这时,address不一定会是这个数字。
当在赋值之前,这个pointer是garbage
A valid pointer contains the address of some data.
The pointer "points to" the data.
Following the pointer is called "de-referencing" the pointer.
Problem: dereferencing has 2 related but distinct meanings.
To refer to the value stored at the address (for use in normal
calculations)
To allow storage of data at the address (for use in assignment
Statements)
那么现在我们想从一个pointer这里得到一个数字
Integer myNum ← 7
refToInteger myNumPtr ← &myNum
print "the value stored in myNum is", myNum
print "the value, again, is", *myNumPtr
myNum ← *myNumPtr + 1 // Pay attention to this line
*myNumPtr的意思就是dereference,就是从一个pointer的address中读出其中的实际含义。
在上面的例子中,我们已知:
refToInteger myNumPtr 是一个指向integer的指针
myNumptr是一个address
*myNumPtr是一个value,which contain in address,就是7
7+1等于8
然后*myNumPtr的值不变,给myNum重新赋值。
另一个例子:
Integer myNum ← 7
refToInteger myNumPtr ← &myNum
*myNumPtr ← *myNumPtr + 1 // Pay attention to this line
在这里:
myNum 是一个integer,值为7
myNumptr是一个 pointer to a integer,//他的值会是一段地址的代码,并没有实际含义//,并且将myNum的地址复制给myNumPtr。
所以这时候,*myNumPtr的值为7
然后是*myNumPtr 的自加,所以这时候*myNumPtr 将会是8
然而,myNum的值还是7
记住一点,A operation B时,A和B总会是一样的type(除非有强制转换格式)所以说,在一般的判断的时候,首先先检查一下“=”和“==”左右两边是否为同样的格式。
假如说
1:
myNumPtr=1;
这时候,我们知道myNumPtr是一个pointer,他的值是一个address 多半是一串数字,而赋值符号右边是一个integer 1, 所以这是错误的。
2:
*myNumptr=&myNum
这时候,赋值等号左边是一个值,一个指针所指的一个value,而右边是一个address,所以这也是错误的
3:
Int a=‘a’;
这时候,赋值左边是一个integer a, 我们要给a赋值,所以只能是一个integer,而赋值等号的右边,是一个char格式的值,所以这是错误的。
综上所述,在我们遇到一些相如是指针这类的问题的时候,记住,一定要注意左右边是否是同样的格式。