c++中的指针

c++中的指针

想到苏轼的一首诗,叫“夜饮东坡醒复醉”,形容现在的状态非常合适,因为指针我已经看过好几遍了,不过还是忘记了,所以醉了醒,醒了再醉,。。。

指针

指针是一个变量,它的值为另一个变量的地址,那么这就意味着不管这个指针是int型的指针还是其它类型的指针,它的值(即变量的地址)的实际的数据类型都是一个代表内存地址的十六进制数。 不同数据类型的指针之间唯一不同的是,指针所指向的变量或常量的数据类型不同。 avator avator

空指针

在变量声明的时候,如果没有确切的地址可以赋值,为指针变量赋一个NULL的值是一个很好的惯。 赋为NULL值的指针就是空指针。

avator 这时候会注意到此时空指针的值是0.

avator 在大多数的操作系统上,程序不允许访问地址为0的内存,因为该内存是操作系统保留的。 内存地址0有特别重要的意义,它表明该指针不指向一个可以访问的内存位置。按惯例,如果指针包含空值(零值),则假定它不指向任何东西。

所以在实际中要检查是否为空指针 if(ptr) 如果ptr非空
if(!ptr) 如果为空

指针的运算

指针可以进行++,–,+,- 比如 avator

但是注意,因为上面的指针指向的是一个整型变量的地址,所以++了之后,就会加4,16进制里面8加4就是c。如果指向的是个字符的话,就会加1,因为字符占一个字节。

利用指针来遍历数组

常常会用指针来代替数组,因为变量指针可以递增,而数组不能够递增,因为数组是一个常量指针。

avator avator 可以看出来,指针每次加的值是其数据类型的字节数。同样也可以–。即把指针的加,理解成移向下一个位置。

指针的比较

指针可以用关系运算符进行比较,如“==,< , >”,如果p1,p2指向两个相关的变量,比如同一个数组中的不同的元素,则可以对p1和p2进行大小比较。 比如 avator

指针和数组

指针和数组是密切相关的,事实上,指针和数组在很多情况下是要以互换的。例如一个指向数组开头的指针,可以通过使用指针的算术运算来访问数组中的元素, 比如下面两种方式都可以访问数组。 avator 但是指针和数组并不是完全互换的,如果再上面直接让var++,则是不对的,因为var是一个指向数组开头的常量,不能作为左值。 即

数组的名字对应一个指针常量

但是下面这样是可以的,

avator

取var指向的东西的值是可以的。 看下面的 avator 结果如下 avator 发现尽管修改了指针常量var所指向的对象的值,但是var本身的值在整个过程中并没有发生变化,也就是说只要不改变var本身就可以,而改变其指向的对象的值是可以的。 #遍历的时候,需要用一个指针变量ptr来作为游标。而不是var本身。

指针数组

有些情况下需要用数组来存指针,就有了指针数组。 比如

int *ptr[Max];

它的意思是把ptr声明为一个数组,由MAX个整数指针组成,所以数组ptr中的每个元素都是一个指向int值的指针。

avator

指针的指针

指针的指针就像是一个链表一样 pointer1–>pointer2–>variable

其它

其它关于指针的还有,把指针作为参数传递给函数,从函数返回指针等,以及和引用的区别。

打赏,谢谢~~

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,多谢支持~

打开微信扫一扫,即可进行扫码打赏哦