第四章 指针 Pointer(入门)

第三章

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

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

时间: 2024-10-11 14:59:26

第四章 指针 Pointer(入门)的相关文章

第四章 指针 Pointer(高级)

第四章 指针 pointer(高级) 希望初学者在入门的时候,可以看一些英文的原著,我感觉英文书籍是原意,而一些现在中文的翻译是加上了译者的一些理解,多少是拿来的东西,所以一些东西我希望能够按照自己的来. &A  就是取存放A的位置,我们可以将这个位置复制给pointer variable. *A  从A所指的位置中"提取数值" 接上回,首先取个例子: Algorithm findBigger(x, y) Pre: x, y :: refToInteger are valid 

第四章 指针 Pointer(进阶)

第四章 指针 pointer(进阶) 那么我们这次的课程就是学习如何的实现pointer怎么使用pointer. 我们已经知道在pseudo-code如何的declare一个pointer. Integer myNum refToInteger myNumPtr In C++ int myNum; int *myNumPtr; Suppose X is any type. Pseudocode: declare a pointer named ptr using refToX ptr C++: 

<深入理解C指针>学习笔记和总结 第四章 指针和数组

数组是一个什么玩意: 数组和指针我的理解,有相同之处也有不同之处.因有相同之处,因此一些资料上说,数组和指针本质是相同的.因有不同之处,因此也有一些资料上说,数组和指针是不一样的. 相同之处: 数组名字和指针名字都代表了一个地址. 如:int num[10];num是数组名.函数开辟了一个存储十个整数类型的空间,而num是他们的首地址. int *p; p=(int *)malloc(10*sizeof(int));类似的,p也指向了首地址. 不同之处是,num[10]中的空间位置是在栈中,而

第一部分 基础篇 第四章 MongoDB快速入门

声明:该文章主要来自<MongoDB实战>一书内容,主要想通过该书学习MongoDB的相应知识,加深理解,故写在自己的博文当中,作为记录,在最后的章节中,会有一个自己集合MongoDB数据库应用的JavaEE的web应用. MongoDB shell是MongoDB自带的交互式JavaScript shell,用来对MongoDB进行操作和管理的交互式环境. 使用./mongo --help可以查看相关连接参数,下面将从常见的操作,如插入.查询.修改.删除等几个方面阐述MongoDB shel

《精通C#》十四章-.NET程序集入门

在书中,这一章节的开头说的是自定义命名空间和使用命名空间,在以我目前有限的经验来说,程序集就是一个类库经过编译之后,所生成的一个在引用命名空间,进而使用该文件中已经定义好的字段,属性以及方法的文件,以.dll作为后缀名.这也是为什么在书本的开头就是以命名空间入手.那么什么是命名空间,最直观的方法就是去定义一个类,在类的内部你会发现,总有一个namespace关键字,后面还会跟随一个字符串作为名称,这个名称就是命名空间的名字,也就是接下来我们所要说的程序集的名称,我们先说说命名空间,在接下来说程序

《深入理解C指针》第四章 指针和数组

2019-12-01 19:07:20 原文地址:https://www.cnblogs.com/JasonPeng1/p/11967221.html

第五部分 架构篇 第十四章 MongoDB Replica Sets 架构(自动故障转移/读写分离实践)

说明:该篇内容部分来自红丸编写的MongoDB实战文章. 1.简介 MongoDB支持在多个机器中通过异步复制达到故障转移和实现冗余,多机器中同一时刻只有一台是用于写操作,正是由于这个情况,为了MongoDB提供了数据一致性的保障,担当primary角色的服务能把读操作分发给Slave(详情请看前两篇关于Replica Set成员组成和理解). MongoDB高可用分为两种: Master-Slave主从复制:只需要在某一个服务启动时加上-master参数,而另外一个服务加上-slave与-so

《ECMAScript 6 入门- 第四章 数值的扩展》 —— 摘抄

1. 二进制和八进制表示法 ES6提供了二进制和八进制数值的新的写法,分别用前缀0b和0o表示. 0b111110111 === 503 // true 0o767 === 503 // true 八进制用0o前缀表示的方法,将要取代已经在ES5中被逐步淘汰的加前缀0的写法. 2. Number.isFinite(), Number.isNaN() ES6在Number对象上,新提供了Number.isFinite()和Number.isNaN()两个方法,用来检查Infinite和NaN这两个

C和指针 (pointers on C)——第十四章:预处理器

第十四章 预处理器 我跳过了先进的指针主题的章节. 太多的技巧,太学科不适合今天的我.但我真的读,读懂.假设谁读了私下能够交流一下.有的小技巧还是非常有意思. 预处理器这一章的内容.大家肯定都用过.什么#include,#define #ifdef #undef这些,可是绝对用的不多.作为全面了解学C,还是应该都看一看. 预处理器使用方法非常讲究,用不好会失误,用好了会大大加快执行时速度(不是编译速度). 总结: C程序的第一个步骤就是预处理.预处理器共包括下面几个符号: 1.#define 定