指针(pointer) -- (上)

引子:

  blog对于学开发实在是个好东东,一年前问一大神儿算法问题,大神给了个神秘链接(后来那是他的blog地址),遂点开看是对该算法的解析,举例释义伪代码c实现代码样样齐全,大喜。后来查资料blog是首先搜素的,习惯用搜索引擎时键入问题的关键词 + blog。现在试着写写blog,水平有限都是些比较基础的东西,可能没有多少人需要,不过记录下成长也是极好的嘛,哈哈^_^。

正题:

指针通常难以理解,很多由指针引发的错误往往很有隐蔽性。所以对于指针的理解和使用就需要尤为严谨。

指针(pointer)是“指向(point to)"另外一种类型的复合类型。作用与引用类似都是实现对其他对象的间接访问。然而两者在具体实现上是完全不同的。其一,指针本身就是一个对象,具有对象的性质(如在内存中占有一席之地、可以赋值拷贝)、指针还可以在生命周期中改变”指向“;而引用的关键的是引用并不是一个对象。其二,指针和其他内置类型一样在不初始化将有一个不确定的值,而引用定义时必须初始化,而且是一旦初始化就不能轻易地改变(因为一些特殊的手法可以绕开这个限制,如果写关于引用的blog时会分享一些特殊方法,这是后话)。

关于定义:类型声明 *变量名;<Type> *d;  //注意的连续定义指针时,每个变量名前都应该有*

int *ip1,*ip2;//ip1与ip2都是int指针

double *dp1,dp2;//dp1是double指针,dp2是double对象


取地址符(&)与解引用符(*)

关于&:

出两种例外情况(const可以接受非const的值初始化,基类指针可以指向派生类),其他所有指针的类型都要和它所指向的对象严格匹配。

double dval;
double *dp = &dval;    //正确:初始值是double类型对象的地址
double *dp1=dp;        //正确:初始值是dp指向的地址

int *ip=dp;                //错误:指针ip和指针dp的类型不匹配
ip=&dval;                  //错误:试图将double型的对象地址赋给int指针

因为在·声明语句中指针的类型实际上被用于指定它所指向的对象的类型,所以二者必须匹配。如果指针指向了一个其他类型的对象,对于该对象的操作将会出错。

指针值(四种情况):

1.指向一个对象

2.指向紧邻对象所占空间的下一位置。

3.空指针。

4.野指针,除上述三种情况外的情况(试图访问野指针是危险操作)。

关于*:

int ival = 42;
int *ip=&ival;    //ip指向ival
cout << *ip;    //由符号*得到ip指向的对象,输出42

*ip=0;            //由符号*得到ip指向的对象并改变其值
cout << *ip;    //输出0

最后一个代码段说明*和&在不同地方出现的作用

int i = 42;
int &r=i;            //    &紧跟随类型名出现,因此是声明的一部分,r是一个引用
int *p;              //    *紧跟随类型名出现,因此是声明的一部分,p是一个野指针
p =&i;              //    &出现在表达式中,是一个取地址符
*p=i;               //    *出现在表达式中,是一个解引用符
int &r1=*p;       //    &是声明的部分,*是一个解引用符

/*
//在声明语句中,&与*的作用在于组成复合类型;在表达式中,它们的角色又转变成运算符。在不同的场景中出//现虽然符号相同,但由于意义截然不同,所以我们完全可以把它当做不同的符号来对待。
*/

参考资料:C++ primer (第五版)

Ps:敲字太慢,写不下去啦。。。。。/(ㄒoㄒ)/~~

时间: 2024-10-10 11:01:58

指针(pointer) -- (上)的相关文章

第四章 指针 Pointer(入门)

第三章 指针 Pointer 我第一次上网求助,就是在pointer方面遇到了问题,对于我本人来说,有些时候reference和de-reference,address.location.value经常会弄混的,就连我的教授都自己坦言,不仅C++的初学者都会在pointer方面遇到这样那样的问题,而且一些从业多年的编程大神也会遇到指针上面的问题. 有一个笑话,当你学会了指针才能懂: 一个编程的人刚刚完成了一个项目的编程,但是有一个bug总是出现,在他苦苦思索之时,平时打扫卫生的保洁阿姨在旁边说:

第四章 指针 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和指针 (pointers on C)——第六章:指针(上)

第六章 指针 这一章,就明显触痛初学者敏感之处了.我也是在一段时间不用C以后就会对这一部分生疏,好吧,其实是对高级指针那块生疏. 当然这一部分总有很多借鉴之处,比如数组范围的问题等,要不我也不会大夏天的这么虐自己看这种书. 总结: 指针变量的值并非它所指向的内存位置所存储的值,而是保存了指向的变量的地址.需要通过间接访问符*来访问指向的变量的值. 单单声明一个指针,而并不进行初始化,是不会分配内存的.所以在指针执行间接访问之前,指针必需进行初始化. 要么指向某个变量.要么去malloc一个内存.

第四章 指针 Pointer(高级)

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

常量指针(pointer to constant)和指针常量(constant pointer)

一个指针可以操作两个实体,一个是指针值(即地址),一个是间访值(即指向的实体).于是指针的常量性也分为两种:常量指针(pointer to constant)和指针常量(constant pointer). 指针常量是相对于指针变量而言的,也就是指针值不能修改的指针.常量指针是指向常量的指针的简称. 定义指针常量还是常量指针就看const修饰,若const修饰指针本身,则为指针常量,若修饰指针类型(指向的实体的类型),则为常量指针. 常量指针:const int* ip=&a; 指针常量:int

Golang 中的指针 - Pointer

Go 的原生数据类型可以分为基本类型和高级类型,基本类型主要包含 string, bool, int 及 float 系列,高级类型包含 struct,array/slice,map,chan, func . 相比 Java,Python,Javascript 等引用类型的语言,Golang 拥有类似C语言的指针这个相对古老的特性.但不同于 C 语言,Golang 的指针是单独的类型,而不是 C 语言中的 int 类型,而且也不能对指针做整数运算.从这一点看,Golang 的指针基本就是一种引用

第二十七课 再论智能指针(上)

思考: 使用智能指针替换单链表LinkLIst中的原生指针是否可行? 将LinkList.h中的Node指针全部改成智能指针: 1 #ifndef LINKLIST_H 2 #define LINKLIST_H 3 4 #include "List.h" 5 #include "Exception.h" 6 #include "SmartPointer.h" 7 8 namespace DTLib 9 { 10 11 template <

再论智能指针(上)

0.引言: 目的:使用智能指针替代LinkList中的原生的指针, 限制:但是我们的智能指针设定了只能单个指针指向某一片堆空间 1. 智能指针的继承层次结构 (1)Pointer是智能指针的抽象父类(模板) ①纯虚析构函数:virtual ~Pointer()=0; ②重载operator->() ③重载operator*() (2)类的声明 1 template <typename T> 2 class Pointer : public Object 3 { 4 protected:

指针(pointer)总结

一.描述 指针是 " 指向 " 另外一种类型的复合类型. 与引用(reference)不同之处在于: 指针本身就是一个对象,允许对指针进行复制和拷贝,而且在其生命周期内可以先后指向几个不同的对象: 指针无需在定义是赋予初值,此时它将拥有一个不确定值.但是建议初始化所有指针,这样可以避免一些不必要的错误. 二.指针的四种状态 指向一个对象: 指向紧邻对象所占空间的下一个位置: 空指针,即没有指向任何对象: 无效指针,即上述情况之外的其他值. 注意: 试图拷贝或以其他方式访问无效指针的值都